Skip to content

Commit 30cb113

Browse files
authored
Merge pull request #131 from ipa-nhg/Ros2LaunchGenerator
Add first draft for the ROS2 launch files generator
2 parents e9f63bf + 36b7ffa commit 30cb113

14 files changed

Lines changed: 732 additions & 402 deletions

File tree

plugins/de.fraunhofer.ipa.rossystem.xtext.tests/resources/test.rossystem

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,25 @@ RosSystem { Name 'test_system' RosComponents (
1515
}
1616
} , ComponentInterface { name test_node2 NameSpace test2
1717
FromRosNode "test_pkg.test_node.test_node"
18-
RosPublishers { RosPublisher "test2/scan" { ns test2 RefPublisher "test_pkg.test_node.test_node.scan" } }
19-
RosSubscribers { RosSubscriber "test2/power_state" { ns test2 RefSubscriber "test_pkg.test_node.test_node.power_state" } }
20-
RosSrvServers { RosServiceServer "test2/setBool" { ns test2 RefServer "test_pkg.test_node.test_node.setBool" } }
21-
RosSrvClients { RosServiceClient "test2/init" { ns test2 RefClient "test_pkg.test_node.test_node.init" } }
22-
RosParameters { RosParameter "test2/string_test" { ns test2 RefParameter "test_pkg.test_node.test_node.string_test" } ,
23-
RosParameter "test2/bool_tets" { ns test2 RefParameter "test_pkg.test_node.test_node.bool_tets" } ,
24-
RosParameter "test2/array_tets" { ns test2 RefParameter "test_pkg.test_node.test_node.array_tets" } ,
25-
RosParameter "test2/base64_test" { ns test2 RefParameter "test_pkg.test_node.test_node.base64_test" } ,
26-
RosParameter "test2/double_test" { ns test2 RefParameter "test_pkg.test_node.test_node.double_test" } ,
27-
RosParameter "test2/int_test" { ns test2 RefParameter "test_pkg.test_node.test_node.int_test" } ,
28-
RosParameter "test2/list_test" { ns test2 RefParameter "test_pkg.test_node.test_node.list_test" }
18+
RosPublishers { RosPublisher "scan" { RefPublisher "test_pkg.test_node.test_node.scan" } }
19+
RosSubscribers { RosSubscriber "power_state" { RefSubscriber "test_pkg.test_node.test_node.power_state" } }
20+
RosSrvServers { RosServiceServer "setBool" { RefServer "test_pkg.test_node.test_node.setBool" } }
21+
RosSrvClients { RosServiceClient "init" { RefClient "test_pkg.test_node.test_node.init" } }
22+
RosParameters { RosParameter "string_test" { RefParameter "test_pkg.test_node.test_node.string_test" } ,
23+
RosParameter "bool_tets" { RefParameter "test_pkg.test_node.test_node.bool_tets" } ,
24+
RosParameter "array_tets" { RefParameter "test_pkg.test_node.test_node.array_tets" } ,
25+
RosParameter "base64_test" { RefParameter "test_pkg.test_node.test_node.base64_test" } ,
26+
RosParameter "double_test" { RefParameter "test_pkg.test_node.test_node.double_test" } ,
27+
RosParameter "int_test" { RefParameter "test_pkg.test_node.test_node.int_test" } ,
28+
RosParameter "list_test" { RefParameter "test_pkg.test_node.test_node.list_test" }
2929
}
3030
} , ComponentInterface { name test_nodea
3131
RosPublishers { RosPublisher power_state { RefPublisher "test_pkg.test_node.test_node.power_state" } }
3232
RosSubscribers { RosSubscriber scan { RefSubscriber "test_pkg.test_node.test_node.scan" } }
3333
RosSrvServers { RosServiceServer init { RefServer "test_pkg.test_node.test_node.init" } }
3434
RosSrvClients { RosServiceClient SetBool { RefClient "test_pkg.test_node.test_node.SetBool" } }
3535
} ) TopicConnections {
36-
TopicConnection scan { From ( "test_node.scan" ) To ( "test_nodea.scan" ) } ,
36+
TopicConnection scan_rename { From ( "test_node.scan" ) To ( "test_nodea.scan" ) } ,
3737
TopicConnection power_state { From ( "test_nodea.power_state" ) To ( "test_node.power_state" ) }
3838
} ServiceConnections { ServiceConnection init { From ( "test_nodea.init" ) To "test_node.init" } }
3939
Parameters {

plugins/de.fraunhofer.ipa.rossystem.xtext.tests/resources/test_system.componentinterface

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
11
ComponentInterface { name test_system
22
RosPublishers{
33
RosPublisher "scan" { RefPublisher "test_pkg.test_node.test_node.scan"},
4-
RosPublisher "test2/scan" { RefPublisher "test_pkg.test_node.test_node.scan"},
54
RosPublisher "power_state" { RefPublisher "test_pkg.test_node.test_node.power_state"}
65
}
76
RosSubscribers{
87
RosSubscriber "power_state" { RefSubscriber "test_pkg.test_node.test_node.power_state"},
9-
RosSubscriber "test2/power_state" { RefSubscriber "test_pkg.test_node.test_node.power_state"},
108
RosSubscriber "scan" { RefSubscriber "test_pkg.test_node.test_node.scan"}
119
}
1210
RosSrvServers{
1311
RosServiceServer "setBool" { RefServer "test_pkg.test_node.test_node.setBool"},
14-
RosServiceServer "test2/setBool" { RefServer "test_pkg.test_node.test_node.setBool"},
1512
RosServiceServer "init" { RefServer "test_pkg.test_node.test_node.init"}
1613
}
1714
RosSrvClients{
1815
RosServiceClient "init" { RefClient "test_pkg.test_node.test_node.init"},
19-
RosServiceClient "test2/init" { RefClient "test_pkg.test_node.test_node.init"},
2016
RosServiceClient "SetBool" { RefClient "test_pkg.test_node.test_node.SetBool"}
2117
}
2218
RosParameters{

plugins/de.fraunhofer.ipa.rossystem.xtext.tests/resources/test_system/launch/test_system.launch

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@
44
<rosparam param="list">[1,2,a]</rosparam>
55
<rosparam param="list">[1,3]</rosparam>
66
<rosparam>
7-
first_element:8
8-
third_element:dsd
7+
first_element: 8
8+
third_element: dsd
99
</rosparam>
10-
10+
1111
<node pkg="test_pkg" type="test_node" name="test_node" cwd="node" respawn="false" output="screen">
12+
<remap from='scan' to='scan_rename' />
1213
</node>
1314
<node pkg="test_pkg" type="test_node" name="test_node2" ns="test2" cwd="node" respawn="false" output="screen">
1415
</node>
1516
<node pkg="test_pkg" type="test_node" name="test_nodea" cwd="node" respawn="false" output="screen">
17+
<remap from='scan' to='scan_rename' />
1618
</node>
1719

1820
</launch>

plugins/de.fraunhofer.ipa.rossystem.xtext.tests/src/de/fraunhofer/ipa/rossystem/tests/RosSystemGeneratorTest.xtend

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,15 @@ class RosSystemGeneratorTest {
102102

103103
// Test the generated launch file
104104
Assert.assertEquals(new String(Files.readAllBytes(Paths.get(RESOURCES_BASE_DIR+'/test_system/launch/', 'test_system.launch'))).trim,
105-
fsa.textFiles.get(CustomOutputProvider::DEFAULT_OUTPUT+'test_system/launch/test_system.launch').toString.trim)
105+
fsa.textFiles.get(CustomOutputProvider::DEFAULT_OUTPUT+'test_system/launch/test_system.launch').toString.trim)
106+
107+
// Test the generated package.xml file
108+
Assert.assertEquals(new String(Files.readAllBytes(Paths.get(RESOURCES_BASE_DIR+'/test_system/', 'package.xml'))).trim,
109+
fsa.textFiles.get(CustomOutputProvider::DEFAULT_OUTPUT+'test_system/package.xml').toString.trim)
110+
111+
// Test the generated CMakeLists.txt file
112+
Assert.assertEquals(new String(Files.readAllBytes(Paths.get(RESOURCES_BASE_DIR+'/test_system/', 'CMakeLists.txt'))).trim,
113+
fsa.textFiles.get(CustomOutputProvider::DEFAULT_OUTPUT+'test_system/CMakeLists.txt').toString.trim)
106114

107115
// Test the generated component interface
108116
Assert.assertEquals(new String(Files.readAllBytes(Paths.get(RESOURCES_BASE_DIR+'/test_system.componentinterface'))).trim,

plugins/de.fraunhofer.ipa.rossystem.xtext.tests/src/de/fraunhofer/ipa/rossystem/tests/RosSystemParsingTest.xtend

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class RosSystemParsingTest {
4242
Assert.assertEquals("test_node", ComponentName)
4343

4444
val TopicConnectionName = model.topicConnections.get(0).topicName
45-
Assert.assertEquals("scan", TopicConnectionName)
45+
Assert.assertEquals("scan_rename", TopicConnectionName)
4646

4747
val FromTopic = model.topicConnections.get(0).from.get(0).name
4848
val Publisher = model.rosComponent.get(0).rospublisher.get(0).name

plugins/de.fraunhofer.ipa.rossystem.xtext/src/de/fraunhofer/ipa/rossystem/generator/CMakeListsCompiler.xtend

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class CMakeListsCompiler {
88
@Inject extension GeneratorHelpers
99

1010

11-
def compile_CMakeLists(RosSystem system) '''«init_pkg()»
11+
def compile_CMakeLists_ROS1(RosSystem system) '''«init_pkg()»
1212
cmake_minimum_required(VERSION 2.8.3)
1313
projectsystem.name.toLowerCase»)
1414

@@ -22,4 +22,28 @@ install(DIRECTORY launch
2222
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
2323
)'''
2424

25+
def compile_CMakeLists_ROS2(RosSystem system) '''«init_pkg()»
26+
cmake_minimum_required(VERSION 3.5)
27+
projectsystem.name.toLowerCase»)
28+
29+
# Default to C++14
30+
if(NOT CMAKE_CXX_STANDARD)
31+
set(CMAKE_CXX_STANDARD 14)
32+
endif()
33+
34+
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
35+
add_compile_options(-Wall -Wextra -Wpedantic)
36+
endif()
37+
38+
find_package(ament_cmake REQUIRED)
39+
40+
### INSTALL ###
41+
install(DIRECTORY launch
42+
DESTINATION share/${PROJECT_NAME}
43+
)
44+
45+
ament_package()
46+
'''
47+
48+
2549
}

plugins/de.fraunhofer.ipa.rossystem.xtext/src/de/fraunhofer/ipa/rossystem/generator/ComponentInterfaceCompiler.xtend

Lines changed: 26 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ import rossystem.RosSystem
2222
import ros.ParameterValue
2323
import ros.impl.ParameterStructMemberImpl
2424
import ros.Node
25+
import ros.impl.ArtifactImpl
26+
import org.eclipse.emf.ecore.EObject
27+
import ros.impl.NodeImpl
2528

2629
class ComponentInterfaceCompiler {
2730
@Inject extension GeneratorHelpers
@@ -51,10 +54,8 @@ class ComponentInterfaceCompiler {
5154
boolean ArtifactSet
5255
boolean PackageSet
5356

54-
String artifact_impl
55-
Object artifact_name
56-
String node_impl
57-
String node_name
57+
ArtifactImpl artifact_impl
58+
NodeImpl node_impl
5859

5960
String param_value
6061
String value_return
@@ -102,55 +103,55 @@ ComponentInterface { name «system.name»
102103
RosPublishers{
103104
«FOR pub:pubs»
104105
«val count_pub=count_pub--»
105-
RosPublisher "«pub.name»" { RefPublisher "«pub.publisher.package_pub».«pub.publisher.artifact_pub».«pub.publisher.node_pub».«pub.publisher.name»"}«IF count_pub > 1 »,«ENDIF»
106+
RosPublisher "«pub.name»" { RefPublisher "«pub.publisher.package_pub».«pub.publisher.getArtifact».«pub.publisher.getNode».«pub.publisher.name»"}«IF count_pub > 1 »,«ENDIF»
106107
«ENDFOR»
107108
}
108109
«ENDIF»
109110
«IF !subs.empty»
110111
RosSubscribers{
111112
«FOR sub:subs»
112113
«val count_sub=count_sub--»
113-
RosSubscriber "«sub.name»" { RefSubscriber "«sub.subscriber.package_sub».«sub.subscriber.artifact_sub».«sub.subscriber.node_sub».«sub.subscriber.name»"}«IF count_sub > 1 »,«ENDIF»
114+
RosSubscriber "«sub.name»" { RefSubscriber "«sub.subscriber.package_sub».«sub.subscriber.getArtifact».«sub.subscriber.getNode».«sub.subscriber.name»"}«IF count_sub > 1 »,«ENDIF»
114115
«ENDFOR»
115116
}
116117
«ENDIF»
117118
«IF !svrs.empty»
118119
RosSrvServers{
119120
«FOR svrs:svrs»
120121
«val count_srvs=count_srvs--»
121-
RosServiceServer "«svrs.name»" { RefServer "«svrs.srvserver.package_srvserv».«svrs.srvserver.artifact_srvserv».«svrs.srvserver.node_srvserv».«svrs.srvserver.name»"}«IF count_srvs > 1 »,«ENDIF»
122+
RosServiceServer "«svrs.name»" { RefServer "«svrs.srvserver.package_srvserv».«svrs.srvserver.getArtifact».«svrs.srvserver.getNode».«svrs.srvserver.name»"}«IF count_srvs > 1 »,«ENDIF»
122123
«ENDFOR»
123124
}
124125
«ENDIF»
125126
«IF !svrc.empty»
126127
RosSrvClients{
127128
«FOR svrc:svrc»
128129
«val count_srvc=count_srvc--»
129-
RosServiceClient "«svrc.name»" { RefClient "«svrc.srvclient.package_srvcli».«svrc.srvclient.artifact_srvcli».«svrc.srvclient.node_srvcli».«svrc.srvclient.name»"}«IF count_srvc > 1 »,«ENDIF»
130+
RosServiceClient "«svrc.name»" { RefClient "«svrc.srvclient.package_srvcli».«svrc.srvclient.getArtifact».«svrc.srvclient.getNode».«svrc.srvclient.name»"}«IF count_srvc > 1 »,«ENDIF»
130131
«ENDFOR»
131132
}
132133
«ENDIF»
133134
«IF !acts.empty»
134135
RosActionServers{
135136
«FOR acts:acts»
136137
«val count_acts=count_acts--»
137-
RosActionServer "«acts.name»" { RefServer "«acts.actserver.package_actserver».«acts.actserver.artifact_actserver».«acts.actserver.node_actserver».«acts.actserver.name»"}«IF count_acts > 1 »,«ENDIF»
138+
RosActionServer "«acts.name»" { RefServer "«acts.actserver.package_actserver».«acts.actserver.getArtifact».«acts.actserver.getNode».«acts.actserver.name»"}«IF count_acts > 1 »,«ENDIF»
138139
«ENDFOR»
139140
}
140141
«ENDIF»
141142
«IF !actc.empty»
142143
RosActionClients{
143144
«FOR actc:actc»
144145
«val count_actc=count_actc--»
145-
RosActionClient "«actc.name»" { RefClient "«actc.actclient.package_actclient».«actc.actclient.artifact_actclient».«actc.actclient.node_actclient».«actc.actclient.name»"}«IF count_actc > 1 »,«ENDIF»
146+
RosActionClient "«actc.name»" { RefClient "«actc.actclient.package_actclient».«actc.actclient.getArtifact».«actc.actclient.getNode».«actc.actclient.name»"}«IF count_actc > 1 »,«ENDIF»
146147
«ENDFOR»
147148
}
148149
«ENDIF»
149150
«IF count_param>0»
150151
RosParameters{
151152
«FOR param:rosparams»
152153
«val count_param=count_param--»
153-
RosParameter "«compile_param_name(param.parameter,"")»" { RefParameter "«param.parameter.package_rosparam».«param.parameter.artifact_rosparam».«param.parameter.node_rosparam».«param.parameter.name»"«IF param.value!==null » value «compile_rosparam_value(param.value)»«ENDIF» }«IF count_param > 1»,«ENDIF»
154+
RosParameter "«compile_param_name(param.parameter,"")»" { RefParameter "«param.parameter.package_rosparam».«param.parameter.getArtifact».«param.parameter.getNode».«param.parameter.name»"«IF param.value!==null » value «compile_rosparam_value(param.value)»«ENDIF» }«IF count_param > 1»,«ENDIF»
154155
«ENDFOR»«FOR param:system.parameter»
155156
«val count_param=count_param--»
156157
RosParameter "«param.name»" { RefParameter "«param.name»"«IF param.value!==null » value «compile_rosparam_value(param.value)»«ENDIF» }«IF count_param > 1»,«ENDIF»
@@ -167,77 +168,25 @@ RosParameters{
167168
}
168169

169170
def compile_art(ComponentInterface component)
170-
'''«IF ! (component.fromRosNode===null)»«component.fromRosNode.getArtifact_rosnode»«ELSEIF !ArtifactSet && !component.rospublisher.empty»«FOR Rospublisher:component.rospublisher»«IF !ArtifactSet»«Rospublisher.publisher.getArtifact_pub()»«ENDIF»«ENDFOR»«ELSEIF !ArtifactSet && !component.rossubscriber.empty»«FOR Rossubscriber:component.rossubscriber»«IF !ArtifactSet»«Rossubscriber.subscriber.getArtifact_sub()»«ENDIF»«ENDFOR»«ELSEIF !ArtifactSet && !component.rosserviceserver.empty»«FOR Rosserviceserver:component.rosserviceserver»«IF !ArtifactSet»«Rosserviceserver.srvserver.getArtifact_srvserv()»«ENDIF»«ENDFOR»«ELSEIF !ArtifactSet && !component.rosserviceclient.empty»«FOR Rosserviceclient:component.rosserviceclient»«IF !ArtifactSet»«Rosserviceclient.srvclient.getArtifact_srvcli()»«ENDIF»«ENDFOR»«ELSEIF !ArtifactSet && !component.rosparameter.empty»«FOR RosParameter:component.rosparameter»«IF !ArtifactSet»«RosParameter.parameter.getArtifact_rosparam()»«ENDIF»«ENDFOR»«ELSEIF !ArtifactSet && !component.rosactionserver.empty»«FOR Rosactionserver:component.rosactionserver»«IF !ArtifactSet»«Rosactionserver.actserver.getArtifact_actserver()»«ENDIF»«ENDFOR»«ELSEIF !ArtifactSet && !component.rosactionclient.empty»«FOR Rosactionclient:component.rosactionclient»«IF !ArtifactSet»«Rosactionclient.actclient.getArtifact_actclient()»«ENDIF»«ENDFOR»«ENDIF»'''
171-
def getArtifact_pub(Publisher publisher){
172-
artifact_impl = publisher.eContainer.eContainer.toString;
173-
return artifact_impl.getArtifact;
174-
}
175-
def getArtifact_sub(Subscriber subscriber){
176-
artifact_impl = subscriber.eContainer.eContainer.toString;
177-
return artifact_impl.getArtifact;
178-
}
179-
def getArtifact_srvserv(ServiceServer serviceserver){
180-
artifact_impl = serviceserver.eContainer.eContainer.toString;
181-
return artifact_impl.getArtifact;
182-
}
183-
def getArtifact_srvcli(ServiceClient serviceclient){
184-
artifact_impl = serviceclient.eContainer.eContainer.toString;
185-
return artifact_impl.getArtifact;
186-
}
187-
def getArtifact_actserver(ActionServer actionserver){
188-
artifact_impl = actionserver.eContainer.eContainer.toString;
189-
return artifact_impl.getArtifact;
190-
}
191-
def getArtifact_actclient(ActionClient actionclient){
192-
artifact_impl = actionclient.eContainer.eContainer.toString;
193-
return artifact_impl.getArtifact;
194-
}
195-
def getArtifact_rosparam(Parameter param){
196-
artifact_impl = param.eContainer.eContainer.toString;
197-
return artifact_impl.getArtifact;
198-
}
199-
def getArtifact_rosnode(Node node){
200-
artifact_impl = node.eContainer.toString;
201-
return artifact_impl.getArtifact;
202-
}
203-
def getArtifact(String artifact_impl){
204-
artifact_name = artifact_impl.substring(artifact_impl.indexOf("name")+6,artifact_impl.length-1)
171+
'''«IF ! (component.fromRosNode===null)»«component.fromRosNode.getArtifactFromNode»«ELSEIF !ArtifactSet && !component.rospublisher.empty»«FOR Rospublisher:component.rospublisher»«IF !ArtifactSet»«Rospublisher.publisher.getArtifact()»«ENDIF»«ENDFOR»«ELSEIF !ArtifactSet && !component.rossubscriber.empty»«FOR Rossubscriber:component.rossubscriber»«IF !ArtifactSet»«Rossubscriber.subscriber.getArtifact()»«ENDIF»«ENDFOR»«ELSEIF !ArtifactSet && !component.rosserviceserver.empty»«FOR Rosserviceserver:component.rosserviceserver»«IF !ArtifactSet»«Rosserviceserver.srvserver.getArtifact()»«ENDIF»«ENDFOR»«ELSEIF !ArtifactSet && !component.rosserviceclient.empty»«FOR Rosserviceclient:component.rosserviceclient»«IF !ArtifactSet»«Rosserviceclient.srvclient.getArtifact()»«ENDIF»«ENDFOR»«ELSEIF !ArtifactSet && !component.rosparameter.empty»«FOR RosParameter:component.rosparameter»«IF !ArtifactSet»«RosParameter.parameter.getArtifact()»«ENDIF»«ENDFOR»«ELSEIF !ArtifactSet && !component.rosactionserver.empty»«FOR Rosactionserver:component.rosactionserver»«IF !ArtifactSet»«Rosactionserver.actserver.getArtifact()»«ENDIF»«ENDFOR»«ELSEIF !ArtifactSet && !component.rosactionclient.empty»«FOR Rosactionclient:component.rosactionclient»«IF !ArtifactSet»«Rosactionclient.actclient.getArtifact()»«ENDIF»«ENDFOR»«ENDIF»'''
172+
173+
def getArtifact(EObject interfaz){
174+
artifact_impl = interfaz.eContainer.eContainer as ArtifactImpl;
205175
ArtifactSet=true;
206-
return artifact_name;
176+
return artifact_impl.name
207177
}
208178

209-
def getNode_pub(Publisher publisher){
210-
node_impl = publisher.eContainer.toString;
211-
return node_impl.getNode;
212-
}
213-
def getNode_sub(Subscriber subscriber){
214-
node_impl = subscriber.eContainer.toString;
215-
return node_impl.getNode;
216-
}
217-
def getNode_srvserv(ServiceServer serviceserver){
218-
node_impl = serviceserver.eContainer.toString;
219-
return node_impl.getNode;
220-
}
221-
def getNode_srvcli(ServiceClient serviceclient){
222-
node_impl = serviceclient.eContainer.toString;
223-
return node_impl.getNode;
224-
}
225-
def getNode_actserver(ActionServer actionserver){
226-
node_impl = actionserver.eContainer.toString;
227-
return node_impl.getNode;
228-
}
229-
def getNode_actclient(ActionClient actionclient){
230-
node_impl = actionclient.eContainer.toString;
231-
return node_impl.getNode;
232-
}
233-
def getNode_rosparam(Parameter param){
234-
node_impl = param.eContainer.toString;
235-
return node_impl.getNode;
179+
def getArtifactFromNode(Node node){
180+
artifact_impl = node.eContainer as ArtifactImpl;
181+
ArtifactSet=true;
182+
return artifact_impl.name
236183
}
237-
def getNode(String node_impl){
238-
node_name = node_impl.substring(node_impl.indexOf("name")+6,node_impl.length-1)
239-
return node_name;
184+
185+
def getNode(EObject interfaz){
186+
node_impl = interfaz.eContainer as NodeImpl;
187+
return node_impl.name;
240188
}
189+
241190

242191
def prefix(String NS){
243192
if(NS===""){

0 commit comments

Comments
 (0)