rtext 0.8.2 → 0.9.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +116 -89
- data/Project.yaml +15 -0
- data/RText_Protocol +47 -4
- data/lib/rtext/context_builder.rb +49 -8
- data/lib/rtext/default_completer.rb +212 -163
- data/lib/rtext/default_service_provider.rb +3 -3
- data/lib/rtext/frontend/connector.rb +130 -56
- data/lib/rtext/instantiator.rb +8 -4
- data/lib/rtext/language.rb +5 -5
- data/lib/rtext/serializer.rb +3 -3
- data/lib/rtext/service.rb +281 -253
- data/lib/rtext/tokenizer.rb +1 -1
- metadata +32 -44
- data/Rakefile +0 -46
- data/test/completer_test.rb +0 -606
- data/test/context_builder_test.rb +0 -948
- data/test/frontend/context_test.rb +0 -301
- data/test/instantiator_test.rb +0 -1735
- data/test/integration/backend.out +0 -13
- data/test/integration/crash_on_request_editor.rb +0 -12
- data/test/integration/ecore_editor.rb +0 -50
- data/test/integration/frontend.log +0 -40502
- data/test/integration/model/invalid_encoding.invenc +0 -2
- data/test/integration/model/test.crash_on_request +0 -18
- data/test/integration/model/test.crashing_backend +0 -18
- data/test/integration/model/test.dont_open_socket +0 -0
- data/test/integration/model/test.invalid_cmd_line +0 -0
- data/test/integration/model/test.not_in_rtext +0 -0
- data/test/integration/model/test_large_with_errors.ect3 +0 -43523
- data/test/integration/model/test_metamodel.ect +0 -24
- data/test/integration/model/test_metamodel2.ect +0 -5
- data/test/integration/model/test_metamodel3.ect4 +0 -7
- data/test/integration/model/test_metamodel_error.ect2 +0 -3
- data/test/integration/model/test_metamodel_ok.ect2 +0 -18
- data/test/integration/test.rb +0 -966
- data/test/link_detector_test.rb +0 -287
- data/test/message_helper_test.rb +0 -118
- data/test/rtext_test.rb +0 -11
- data/test/serializer_test.rb +0 -1004
- data/test/tokenizer_test.rb +0 -173
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0e14d27070197af864d0b24a38f9d41cb4115c3
|
4
|
+
data.tar.gz: '0984afc951a23e67def08c00be574c3b9b92647d'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8ad0fbe93721f12c413f839d4448cc606e50c0ad001272d35f47f67c57fe54b404472a7164f2abee3dec526d9dbd33c60bc16ea80a2b68fc0b7c486ce1ac43f
|
7
|
+
data.tar.gz: bc569b6b09999d14abf10f05c606b738880ffe6f480c520982b052ef3a39124548932e9dfd7901bc92b6f99e6495d6ddf3f87e88a04a97e4f52ec405caeb5b67
|
data/CHANGELOG
CHANGED
@@ -1,89 +1,116 @@
|
|
1
|
-
=0.2.0
|
2
|
-
|
3
|
-
* First public release
|
4
|
-
|
5
|
-
=0.3.0
|
6
|
-
|
7
|
-
* Added context sensitive commands
|
8
|
-
* Show child role lables in auto completer
|
9
|
-
* Show unlabled arguments in auto completer
|
10
|
-
* Show only arguments in auto completer which don't have a value yet
|
11
|
-
* Fixed auto completion within array values
|
12
|
-
* Fixed generation of child role labels in serializer
|
13
|
-
* Added :after_load hook to DefaultLoader
|
14
|
-
* Added result limit option to DefaultServiceProvider
|
15
|
-
* Removed short_class_names option from Language
|
16
|
-
|
17
|
-
=0.4.0
|
18
|
-
|
19
|
-
* Made instantiator a lot more robust against parse errors
|
20
|
-
* Added DefaultLoader option to not reload fragments with errors
|
21
|
-
* Added service load progress indication and custom problem severity
|
22
|
-
* Fixed serialization of enum literals starting with a digit
|
23
|
-
* Fixed used port detection in service
|
24
|
-
* Fixed completion option order to match order defined in lanugage
|
25
|
-
|
26
|
-
=0.5.0
|
27
|
-
|
28
|
-
* Added annotations
|
29
|
-
* Added generic value support
|
30
|
-
* Added RText frontend support (for Ruby based RText plugins and testing)
|
31
|
-
* Changed frontend/backend protocol to JSON over TCP
|
32
|
-
* Generally improved completer and context builder, fixed bugs, added tests
|
33
|
-
* Added automated frontend/backend tests
|
34
|
-
* Added example language (ECore editor)
|
35
|
-
* Added configurable backward reference attribute
|
36
|
-
* Fixed backward reference resolution in case line ends with name attribute
|
37
|
-
* Added more information to unlabled value completion options
|
38
|
-
* Added backend service support for lanugage exchange at runtime
|
39
|
-
* Extended support for relative reference calculation and resolution
|
40
|
-
* Added on_progress hook to default_loader
|
41
|
-
* Added explicit handling of encoding
|
42
|
-
* Improved backend service progress reporting
|
43
|
-
* Fixed backward reference list to not include opposites of forward references
|
44
|
-
* Fixed problem with backend service socket connection on some machines
|
45
|
-
|
46
|
-
=0.5.1
|
47
|
-
|
48
|
-
* Fixed service connection problem when ports are in use by other processes
|
49
|
-
|
50
|
-
=0.5.2
|
51
|
-
|
52
|
-
* Fixed exception in default service provider when trying to follow a reference on an attribute value
|
53
|
-
* Ignore BOM in instantiator
|
54
|
-
|
55
|
-
=0.5.3
|
56
|
-
|
57
|
-
* Fixed completion of enum values which need to be quoted
|
58
|
-
* Added support for BigDecimal
|
59
|
-
|
60
|
-
=0.6.0
|
61
|
-
|
62
|
-
* Changed service provider interface to allow for more customization
|
63
|
-
* Changed Completer into DefaultCompleter to allow for customization
|
64
|
-
* Added labeled_containments language parameter
|
65
|
-
* Made DefaultLoader robust against missing files
|
66
|
-
|
67
|
-
=0.7.0
|
68
|
-
|
69
|
-
* Added DefaultResolver and support for custom resolvers for DefaultLoader and DefaultServiceProvider
|
70
|
-
* Changed instantiator on_progress proc to take a second argument with the number of progress steps
|
71
|
-
* Changed tokenizer to start new tokens immediately after error tokens
|
72
|
-
* Fixed line number in instantiator problem report for multiple childs in one-role
|
73
|
-
* Fixed unit tests for Ruby 2.0
|
74
|
-
* Fixed context builder prefixes for strings
|
75
|
-
* Fixed DefaultLoader to let fragments calculate their elements list by themselves
|
76
|
-
* Minor performance improvements, mainly for instantiator and when passing large RText messages
|
77
|
-
* Improved performance of frontend connector especially for large amounts of data
|
78
|
-
|
79
|
-
=0.8.0
|
80
|
-
|
81
|
-
* Added line breaks support
|
82
|
-
* Fixed problem when there is no whitespace before a curly bracket
|
83
|
-
* Fixed problem when loading frontend context extractor in vim
|
84
|
-
|
85
|
-
=0.8.1
|
86
|
-
|
87
|
-
* Fixed frontend content extraction to support line breaks with backslash
|
88
|
-
* Fixed frontend content extraction, joining of broken lines
|
89
|
-
|
1
|
+
=0.2.0
|
2
|
+
|
3
|
+
* First public release
|
4
|
+
|
5
|
+
=0.3.0
|
6
|
+
|
7
|
+
* Added context sensitive commands
|
8
|
+
* Show child role lables in auto completer
|
9
|
+
* Show unlabled arguments in auto completer
|
10
|
+
* Show only arguments in auto completer which don't have a value yet
|
11
|
+
* Fixed auto completion within array values
|
12
|
+
* Fixed generation of child role labels in serializer
|
13
|
+
* Added :after_load hook to DefaultLoader
|
14
|
+
* Added result limit option to DefaultServiceProvider
|
15
|
+
* Removed short_class_names option from Language
|
16
|
+
|
17
|
+
=0.4.0
|
18
|
+
|
19
|
+
* Made instantiator a lot more robust against parse errors
|
20
|
+
* Added DefaultLoader option to not reload fragments with errors
|
21
|
+
* Added service load progress indication and custom problem severity
|
22
|
+
* Fixed serialization of enum literals starting with a digit
|
23
|
+
* Fixed used port detection in service
|
24
|
+
* Fixed completion option order to match order defined in lanugage
|
25
|
+
|
26
|
+
=0.5.0
|
27
|
+
|
28
|
+
* Added annotations
|
29
|
+
* Added generic value support
|
30
|
+
* Added RText frontend support (for Ruby based RText plugins and testing)
|
31
|
+
* Changed frontend/backend protocol to JSON over TCP
|
32
|
+
* Generally improved completer and context builder, fixed bugs, added tests
|
33
|
+
* Added automated frontend/backend tests
|
34
|
+
* Added example language (ECore editor)
|
35
|
+
* Added configurable backward reference attribute
|
36
|
+
* Fixed backward reference resolution in case line ends with name attribute
|
37
|
+
* Added more information to unlabled value completion options
|
38
|
+
* Added backend service support for lanugage exchange at runtime
|
39
|
+
* Extended support for relative reference calculation and resolution
|
40
|
+
* Added on_progress hook to default_loader
|
41
|
+
* Added explicit handling of encoding
|
42
|
+
* Improved backend service progress reporting
|
43
|
+
* Fixed backward reference list to not include opposites of forward references
|
44
|
+
* Fixed problem with backend service socket connection on some machines
|
45
|
+
|
46
|
+
=0.5.1
|
47
|
+
|
48
|
+
* Fixed service connection problem when ports are in use by other processes
|
49
|
+
|
50
|
+
=0.5.2
|
51
|
+
|
52
|
+
* Fixed exception in default service provider when trying to follow a reference on an attribute value
|
53
|
+
* Ignore BOM in instantiator
|
54
|
+
|
55
|
+
=0.5.3
|
56
|
+
|
57
|
+
* Fixed completion of enum values which need to be quoted
|
58
|
+
* Added support for BigDecimal
|
59
|
+
|
60
|
+
=0.6.0
|
61
|
+
|
62
|
+
* Changed service provider interface to allow for more customization
|
63
|
+
* Changed Completer into DefaultCompleter to allow for customization
|
64
|
+
* Added labeled_containments language parameter
|
65
|
+
* Made DefaultLoader robust against missing files
|
66
|
+
|
67
|
+
=0.7.0
|
68
|
+
|
69
|
+
* Added DefaultResolver and support for custom resolvers for DefaultLoader and DefaultServiceProvider
|
70
|
+
* Changed instantiator on_progress proc to take a second argument with the number of progress steps
|
71
|
+
* Changed tokenizer to start new tokens immediately after error tokens
|
72
|
+
* Fixed line number in instantiator problem report for multiple childs in one-role
|
73
|
+
* Fixed unit tests for Ruby 2.0
|
74
|
+
* Fixed context builder prefixes for strings
|
75
|
+
* Fixed DefaultLoader to let fragments calculate their elements list by themselves
|
76
|
+
* Minor performance improvements, mainly for instantiator and when passing large RText messages
|
77
|
+
* Improved performance of frontend connector especially for large amounts of data
|
78
|
+
|
79
|
+
=0.8.0
|
80
|
+
|
81
|
+
* Added line breaks support
|
82
|
+
* Fixed problem when there is no whitespace before a curly bracket
|
83
|
+
* Fixed problem when loading frontend context extractor in vim
|
84
|
+
|
85
|
+
=0.8.1
|
86
|
+
|
87
|
+
* Fixed frontend content extraction to support line breaks with backslash
|
88
|
+
* Fixed frontend content extraction, joining of broken lines
|
89
|
+
|
90
|
+
=0.8.2
|
91
|
+
|
92
|
+
* Fixed serializer negative decimal quotation
|
93
|
+
* Added Object attribute test case
|
94
|
+
|
95
|
+
=0.9.0
|
96
|
+
|
97
|
+
* Added protocol versioning support
|
98
|
+
* Added completion options for square brackets and curly braces
|
99
|
+
|
100
|
+
=0.9.1
|
101
|
+
|
102
|
+
* Fixed backward compatibility issues
|
103
|
+
|
104
|
+
=0.9.2
|
105
|
+
|
106
|
+
* Fixed frontend connector
|
107
|
+
* Fixed frontend tests
|
108
|
+
* Automatic conversion of integer and float values to string
|
109
|
+
|
110
|
+
=0.9.3
|
111
|
+
|
112
|
+
* Added lock file for backend service
|
113
|
+
|
114
|
+
=0.9.4
|
115
|
+
|
116
|
+
* Fixed issue with unquoted multiline strings
|
data/Project.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
name: rtext
|
2
|
+
version: 0.9.4
|
3
|
+
git: https://github.com/mthiede/rtext.git
|
4
|
+
summary: Ruby Textual Modelling
|
5
|
+
email: martin dot thiede at gmx de
|
6
|
+
homepage: http://ruby-gen.org
|
7
|
+
description: RText can be used to derive textual languages from an RGen metamodel with very little effort.
|
8
|
+
authors: [Martin Thiede]
|
9
|
+
dependencies:
|
10
|
+
http://rubygems.org:
|
11
|
+
- {name: rgen, version: '~> 0.8.0'}
|
12
|
+
- {name: filelock, version: '~> 1.1.0'}
|
13
|
+
rdoc_options: [--main, README.rdoc, -x, test]
|
14
|
+
extra_rdoc_files: [README.rdoc, CHANGELOG, MIT-LICENSE, RText_Users_Guide, RText_Protocol]
|
15
|
+
encrypt_sources: false
|
data/RText_Protocol
CHANGED
@@ -4,6 +4,10 @@ RText frontend and backend pass messages containing JSON objects.
|
|
4
4
|
Normally the frontend invokes a backend command by means of a request message and the
|
5
5
|
backend will eventually reply with a response message.
|
6
6
|
|
7
|
+
== Versioning
|
8
|
+
|
9
|
+
RText protocol supports versioning mechanism with a single version natural number.
|
10
|
+
The actual version of the protocol is 1.
|
7
11
|
|
8
12
|
== Encoding
|
9
13
|
|
@@ -25,8 +29,8 @@ In addition, the character "%" is escaped in the same way, i.e. "%" will always
|
|
25
29
|
|
26
30
|
Example:
|
27
31
|
|
28
|
-
The word "
|
29
|
-
"%dcbung" (the "
|
32
|
+
The word "Übung" (german: exercise), encoded in ISO-8859-1 would result in the string:
|
33
|
+
"%dcbung" (the "Ü" Umlaut has a byte value of 0xdc is ISO-8859-1).
|
30
34
|
|
31
35
|
|
32
36
|
== Request Messages
|
@@ -34,9 +38,12 @@ The word "
|
|
34
38
|
Each request message contains a field ``command`` and a field ``invocation_id``.
|
35
39
|
The command field holds the name of the command to be invoked as a string.
|
36
40
|
The invocation id field holds an identifier which will be repeated by the backend's response.
|
41
|
+
The "version" field was introduced in version 1. It is optional for protocol version 0 requests,
|
42
|
+
but mandatory for newer versions.
|
37
43
|
|
38
44
|
{
|
39
45
|
"type": "request",
|
46
|
+
"version": <protocol_version [integer]>,
|
40
47
|
"command": <command>,
|
41
48
|
"invocation_id": <invocation_id>
|
42
49
|
...
|
@@ -65,6 +72,16 @@ There are a number of error message which may be sent in response to a request m
|
|
65
72
|
"invocation_id": <invocation_id>,
|
66
73
|
"command": <unknown command [string]>
|
67
74
|
}
|
75
|
+
|
76
|
+
=== Unsupported Protocol Version Error
|
77
|
+
|
78
|
+
Introduced in version 1.
|
79
|
+
|
80
|
+
{
|
81
|
+
"type": "unsupported_version",
|
82
|
+
"invocation_id": <invocation_id>,
|
83
|
+
"version": <supported version [integer]>
|
84
|
+
}
|
68
85
|
|
69
86
|
== Progress Information
|
70
87
|
|
@@ -90,6 +107,25 @@ The message field may carry information about the currently ongoing subtask.
|
|
90
107
|
For each command, the layout of the request and response messages will be given below.
|
91
108
|
Note that the invocation id field is present in every request and response but is omitted for brevity.
|
92
109
|
|
110
|
+
=== Backend version request
|
111
|
+
|
112
|
+
Introduced in version 1.
|
113
|
+
|
114
|
+
This command requests the backend to disclose its supported protocol version.
|
115
|
+
|
116
|
+
{
|
117
|
+
"type": "request",
|
118
|
+
"command": "version"
|
119
|
+
}
|
120
|
+
|
121
|
+
The backend responds with a version information.
|
122
|
+
|
123
|
+
{
|
124
|
+
"type": "response",
|
125
|
+
"version": <version [integer]>
|
126
|
+
}
|
127
|
+
|
128
|
+
The backend supporting protocool version 0 only responds with an 'Unknown Command Error'.
|
93
129
|
|
94
130
|
=== Load Model
|
95
131
|
|
@@ -141,7 +177,14 @@ build the set of context lines in the frontend. Column number start at 1.
|
|
141
177
|
}
|
142
178
|
|
143
179
|
The backend replies with a list of completion options.
|
144
|
-
The field ``insert`` holds the text to be inserted if the completion option is chosen.
|
180
|
+
The field ``insert`` holds the text to be inserted if the completion option is chosen. This text
|
181
|
+
may contains placeholders for cursor position. An editor may use them to assist a user in
|
182
|
+
filling additional completion fields.
|
183
|
+
Each placeholder must start and end with a vertical bar character (``|``) and can contain up to
|
184
|
+
three optional parts separated by an additional vertical bar character: ordering number, name and
|
185
|
+
description of this cursor position. E.g.: ``||``, ``|1|name|Entity name|``, ``|||New value|``.
|
186
|
+
Placeholders with the same name must be considered as the same value repeated in different
|
187
|
+
positions.
|
145
188
|
The field ``display`` contains the string which should be displayed to the user in some kind of
|
146
189
|
completion option menu. An optional description field may provide more information about a
|
147
190
|
particular option.
|
@@ -458,7 +501,7 @@ the parent commands wrapped around it. Any sibling commands can be omitted as we
|
|
458
501
|
any lines containing closing braces and brackets. The order of lines is the same as in the
|
459
502
|
RText file.
|
460
503
|
|
461
|
-
Here is an example. Consider the following RText file with the cursor in the line of "
|
504
|
+
Here is an example. Consider the following RText file with the cursor in the line of "Command5"
|
462
505
|
at the time when the auto completion command is issued.
|
463
506
|
|
464
507
|
Command1 {
|
@@ -26,7 +26,8 @@ module RText
|
|
26
26
|
#
|
27
27
|
module ContextBuilder
|
28
28
|
|
29
|
-
|
29
|
+
PositionContext = Struct.new(:in_array, :in_block, :after_label, :after_comma, :before_brace, :before_bracket)
|
30
|
+
Context = Struct.new(:element, :feature, :prefix, :problem, :position, :line_indent, :indent)
|
30
31
|
|
31
32
|
class << self
|
32
33
|
include RText::Tokenizer
|
@@ -50,13 +51,37 @@ module ContextBuilder
|
|
50
51
|
else
|
51
52
|
feature = nil
|
52
53
|
end
|
53
|
-
|
54
|
+
context_info.position.after_label = after_label
|
55
|
+
Context.new(element, feature, context_info.prefix, context_info.problem, context_info.position,
|
56
|
+
get_line_indent(context_lines.last), get_indent(context_lines))
|
54
57
|
else
|
55
|
-
|
58
|
+
context_info.position.after_label = false
|
59
|
+
Context.new(nil, nil, context_info.prefix, context_info.problem, context_info.position,
|
60
|
+
get_line_indent(context_lines.last), get_indent(context_lines))
|
56
61
|
end
|
57
62
|
end
|
58
63
|
|
59
64
|
private
|
65
|
+
|
66
|
+
def get_line_indent(line)
|
67
|
+
return '' unless line
|
68
|
+
match = line.match(/^\s+/)
|
69
|
+
if match.nil?
|
70
|
+
''
|
71
|
+
else
|
72
|
+
match[0]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Compute indent from context lines
|
77
|
+
def get_indent(context_lines)
|
78
|
+
cl = context_lines.dup
|
79
|
+
while true
|
80
|
+
return ' ' if cl.size < 2 # default indentation is 2 spaces
|
81
|
+
indent = get_line_indent(cl.last)[get_line_indent(cl.delete_at(-2)).size..-1]
|
82
|
+
return indent unless indent.nil? || indent.empty?
|
83
|
+
end
|
84
|
+
end
|
60
85
|
|
61
86
|
def instantiate_context_element(language, context_info)
|
62
87
|
root_elements = []
|
@@ -72,7 +97,7 @@ module ContextBuilder
|
|
72
97
|
end
|
73
98
|
|
74
99
|
def find_leaf_child(element, num_required_children)
|
75
|
-
childs = element.class.ecore.eAllReferences.select{|r| r.containment}.collect{|r|
|
100
|
+
childs = element.class.ecore.eAllReferences.select{|r| r.containment }.collect{|r|
|
76
101
|
element.getGenericAsArray(r.name)}.flatten
|
77
102
|
if num_required_children == 0
|
78
103
|
element
|
@@ -83,7 +108,7 @@ module ContextBuilder
|
|
83
108
|
end
|
84
109
|
end
|
85
110
|
|
86
|
-
ContextInternal = Struct.new(:lines, :num_elements, :role, :prefix, :
|
111
|
+
ContextInternal = Struct.new(:lines, :num_elements, :role, :prefix, :problem, :position)
|
87
112
|
|
88
113
|
# extend +context_lines+ into a set of lines which can be processed by the RText
|
89
114
|
def fix_context(language, context_lines, position_in_line)
|
@@ -95,11 +120,14 @@ module ContextBuilder
|
|
95
120
|
position_in_line ||= context_lines.last.size
|
96
121
|
# cut off last line right of cursor
|
97
122
|
if position_in_line < 1
|
98
|
-
context_lines.pop
|
123
|
+
tail = context_lines.pop
|
99
124
|
context_lines << ""
|
100
125
|
else
|
126
|
+
tail = context_lines.last[position_in_line..-1]
|
101
127
|
context_lines << context_lines.pop[0..position_in_line-1]
|
102
128
|
end
|
129
|
+
before_brace = !tail.nil? && !tail.match(/^\s*\{/).nil?
|
130
|
+
before_bracket = !tail.nil? && !tail.match(/^\s*\[/).nil?
|
103
131
|
problem = nil
|
104
132
|
line = context_lines.last
|
105
133
|
if line =~ /\{\s*$/
|
@@ -110,7 +138,7 @@ module ContextBuilder
|
|
110
138
|
problem = :after_curly
|
111
139
|
end
|
112
140
|
|
113
|
-
num_elements = in_block = in_array = missing_comma = role = prefix = nil
|
141
|
+
num_elements = in_block = in_array = missing_comma = role = prefix = after_comma = nil
|
114
142
|
tokens = tokenize(line, language.reference_regexp)
|
115
143
|
tokens.pop if tokens.last && tokens.last.kind == :newline
|
116
144
|
if tokens.size > 0 && tokens[0].kind == :identifier
|
@@ -124,6 +152,7 @@ module ContextBuilder
|
|
124
152
|
unlabled_index = 0
|
125
153
|
tokens[1..-1].each do |token|
|
126
154
|
break if token.kind == :error
|
155
|
+
after_comma = false
|
127
156
|
if token.kind == "["
|
128
157
|
in_array = true
|
129
158
|
elsif token.kind == "]"
|
@@ -136,6 +165,7 @@ module ContextBuilder
|
|
136
165
|
missing_comma = false
|
137
166
|
role = nil unless in_array
|
138
167
|
unlabled_index += 1 unless in_array
|
168
|
+
after_comma = true
|
139
169
|
end
|
140
170
|
end
|
141
171
|
if ((tokens.size == 1 && line =~ /\s+$/) ||
|
@@ -187,6 +217,16 @@ module ContextBuilder
|
|
187
217
|
if context_lines[-2] =~ /^\s*\w+:\s*$/
|
188
218
|
context_lines[-1] = context_lines.pop
|
189
219
|
end
|
220
|
+
elsif tokens.size == 1 && tokens[0].kind == :label
|
221
|
+
token = tokens[0]
|
222
|
+
role = context_lines.last[token.scol - 1..token.ecol - 2]
|
223
|
+
context_lines << context_lines.pop[0..token.scol - 2]
|
224
|
+
context = fix_context(language, context_lines, context_lines.last.size)
|
225
|
+
context.role = role
|
226
|
+
context.position.in_block = false
|
227
|
+
context.position.before_brace = before_brace
|
228
|
+
context.position.before_bracket = before_bracket
|
229
|
+
return context
|
190
230
|
else
|
191
231
|
# comment, closing brackets, etc.
|
192
232
|
num_elements = 0
|
@@ -210,7 +250,8 @@ module ContextBuilder
|
|
210
250
|
end
|
211
251
|
end
|
212
252
|
problem = :missing_comma if !problem && missing_comma
|
213
|
-
ContextInternal.new(context_lines, num_elements, role, prefix,
|
253
|
+
ContextInternal.new(context_lines, num_elements, role, prefix, problem,
|
254
|
+
PositionContext.new(in_array, in_block, false, after_comma, before_brace, before_bracket))
|
214
255
|
end
|
215
256
|
|
216
257
|
def find_role(context_lines)
|