Skip to content
GitLab
Projects
Groups
Topics
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
TDL Open Source
TOP IDE
Compare revisions
4559a6581bf85c03cc7fefadb831e35a83be8be6...5b04e6cfb4350ddf69f4006a47146aed0cabddbb
Commits (2)
* switched to common scope provider, minor refinements
· 0a790da3
Philip Makedonski
authored
Jun 26, 2020
0a790da3
+ qualified identifiers in imports
· 5b04e6cf
Philip Makedonski
authored
Jun 26, 2020
5b04e6cf
Hide whitespace changes
Inline
Side-by-side
plugins/org.etsi.mts.tdl.TDLan2/META-INF/MANIFEST.MF
View file @
5b04e6cf
...
...
@@ -6,6 +6,7 @@ Bundle-Version: 1.0.0.qualifier
Bundle-SymbolicName: org.etsi.mts.tdl.TDLan2; singleton:=true
Bundle-ActivationPolicy: lazy
Require-Bundle: org.etsi.mts.tdl.model,
org.etsi.mts.tdl.common,
org.eclipse.xtext,
org.eclipse.xtext.xbase,
org.eclipse.equinox.common;bundle-version="3.5.0",
...
...
plugins/org.etsi.mts.tdl.TDLan2/src/org/etsi/mts/tdl/scoping/TDLan2ScopeProvider.java
View file @
5b04e6cf
package
org.etsi.mts.tdl.scoping
;
import
org.eclipse.emf.common.util.BasicEList
;
import
org.eclipse.emf.common.util.EList
;
import
org.eclipse.emf.ecore.EObject
;
import
org.eclipse.emf.ecore.EReference
;
import
org.eclipse.xtext.naming.IQualifiedNameConverter
;
import
org.eclipse.xtext.naming.QualifiedName
;
import
org.eclipse.xtext.nodemodel.ICompositeNode
;
import
org.eclipse.xtext.nodemodel.util.NodeModelUtils
;
import
org.eclipse.xtext.scoping.IScope
;
import
org.eclipse.xtext.scoping.Scopes
;
import
org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider
;
import
org.etsi.mts.tdl.Action
;
import
org.etsi.mts.tdl.ActionReference
;
import
org.etsi.mts.tdl.Assignment
;
import
org.etsi.mts.tdl.Behaviour
;
import
org.etsi.mts.tdl.Block
;
import
org.etsi.mts.tdl.ComponentInstance
;
import
org.etsi.mts.tdl.ComponentInstanceBinding
;
import
org.etsi.mts.tdl.Connection
;
import
org.etsi.mts.tdl.DataElementMapping
;
import
org.etsi.mts.tdl.DataInstanceUse
;
import
org.etsi.mts.tdl.DataType
;
import
org.etsi.mts.tdl.DataUse
;
import
org.etsi.mts.tdl.Element
;
import
org.etsi.mts.tdl.ElementImport
;
import
org.etsi.mts.tdl.Extension
;
import
org.etsi.mts.tdl.FormalParameterUse
;
import
org.etsi.mts.tdl.FunctionCall
;
import
org.etsi.mts.tdl.GateInstance
;
import
org.etsi.mts.tdl.GateReference
;
import
org.etsi.mts.tdl.LocalExpression
;
import
org.etsi.mts.tdl.MemberAssignment
;
import
org.etsi.mts.tdl.MemberReference
;
import
org.etsi.mts.tdl.Message
;
import
org.etsi.mts.tdl.Package
;
import
org.etsi.mts.tdl.PackageableElement
;
import
org.etsi.mts.tdl.Parameter
;
import
org.etsi.mts.tdl.ParameterBinding
;
import
org.etsi.mts.tdl.ParameterMapping
;
import
org.etsi.mts.tdl.ProcedureCall
;
import
org.etsi.mts.tdl.SimpleDataInstance
;
import
org.etsi.mts.tdl.SimpleDataType
;
import
org.etsi.mts.tdl.StructuredDataInstance
;
import
org.etsi.mts.tdl.StructuredDataType
;
import
org.etsi.mts.tdl.Target
;
import
org.etsi.mts.tdl.TestConfiguration
;
import
org.etsi.mts.tdl.TestDescription
;
import
org.etsi.mts.tdl.TestDescriptionReference
;
import
org.etsi.mts.tdl.Timer
;
import
org.etsi.mts.tdl.TimerOperation
;
import
org.etsi.mts.tdl.ValueAssignment
;
import
org.etsi.mts.tdl.Variable
;
import
org.etsi.mts.tdl.VariableUse
;
import
org.etsi.mts.tdl.tdlPackage
;
import
org.etsi.mts.tdl.structuredobjectives.StructuredTestObjective
;
import
com.google.common.base.Function
;
import
com.google.inject.Inject
;
/**
* This class contains custom scoping description.
...
...
@@ -66,337 +11,11 @@ import com.google.inject.Inject;
* how and when to use it
*
*/
public
class
TDLan2ScopeProvider
extends
AbstractDeclarativeScopeProvider
{
@Inject
private
IQualifiedNameConverter
qualifiedNameConverter
;
public
class
TDLan2ScopeProvider
extends
TDLScopeProvider
{
@Override
public
IScope
getScope
(
EObject
context
,
EReference
reference
)
{
if
(
PackageableElement
.
class
.
isAssignableFrom
(
reference
.
getEType
().
getInstanceClass
())
&&
!(
context
instanceof
ElementImport
))
{
EList
<
EObject
>
elements
=
getScopedElementsOfType
(
context
,
reference
.
getEType
().
getInstanceClass
());
return
Scopes
.
scopeFor
(
elements
);
}
if
(
reference
.
getEType
().
getInstanceClass
()
==
GateInstance
.
class
)
{
if
(
context
instanceof
GateReference
)
{
GateReference
gate
=
(
GateReference
)
context
;
if
(
gate
.
getComponent
().
getType
()!=
null
)
{
IScope
scope
=
Scopes
.
scopeFor
(
gate
.
getComponent
().
getType
().
allGates
());
return
scope
;
}
}
}
else
if
(
reference
.
getEType
().
getInstanceClass
()
==
ComponentInstance
.
class
)
{
if
(
context
instanceof
Behaviour
||
context
instanceof
Block
||
context
instanceof
LocalExpression
||
context
instanceof
VariableUse
)
{
TestDescription
testDescription
=
getTestDescription
((
Element
)
context
);
if
(
testDescription
!=
null
)
{
TestConfiguration
configuration
=
testDescription
.
getTestConfiguration
();
IScope
scope
=
Scopes
.
scopeFor
(
configuration
.
getComponentInstance
());
return
scope
;
}
}
else
if
(
context
instanceof
GateReference
)
{
TestConfiguration
configuration
=
getTestConfiguration
((
Element
)
context
);
EList
<
ComponentInstance
>
components
=
configuration
.
getComponentInstance
();
IScope
scope
=
Scopes
.
scopeFor
(
components
);
return
scope
;
}
else
if
(
context
instanceof
ComponentInstanceBinding
)
{
//assume actual
TestDescription
testDescription
=
getTestDescription
((
Element
)
context
);
if
(
reference
.
getFeatureID
()
==
tdlPackage
.
COMPONENT_INSTANCE_BINDING__FORMAL_COMPONENT
)
{
testDescription
=
((
TestDescriptionReference
)
context
.
eContainer
()).
getTestDescription
();
}
TestConfiguration
configuration
=
testDescription
.
getTestConfiguration
();
EList
<
ComponentInstance
>
components
=
configuration
.
getComponentInstance
();
IScope
scope
=
Scopes
.
scopeFor
(
components
);
return
scope
;
}
}
else
if
(
reference
.
getEType
().
getInstanceClass
()
==
GateReference
.
class
)
{
//TODO: safety checks in case invalid configuration is specified
//TODO: only suggest connected gates as targets?
if
(
context
instanceof
Behaviour
||
context
instanceof
Target
||
context
instanceof
Block
)
{
TestConfiguration
configuration
=
getTestDescription
((
Element
)
context
).
getTestConfiguration
();
EList
<
EObject
>
elements
=
new
BasicEList
<>();
for
(
Connection
c
:
configuration
.
getConnection
())
{
if
(
context
instanceof
Message
)
{
//TODO: quick hack until a better solution is found
ICompositeNode
oppositeNode
=
NodeModelUtils
.
findActualNodeFor
(((
Message
)
context
).
getTarget
().
get
(
0
));
if
(
oppositeNode
!=
null
)
{
String
targetGateName
=
oppositeNode
.
getText
()
.
replaceAll
(
"(?s)where\\s+it\\s+is.+"
,
""
)
.
replaceAll
(
"(?s)with\\s*\\{.+"
,
""
)
.
trim
();
String
[]
split
=
targetGateName
.
split
(
"\\."
);
if
(
split
.
length
==
2
)
{
String
gate
=
split
[
1
];
String
component
=
split
[
0
];
if
(
component
.
equals
(
c
.
getEndPoint
().
get
(
0
).
getComponent
().
getName
())
&&
gate
.
equals
(
c
.
getEndPoint
().
get
(
0
).
getGate
().
getName
()))
{
elements
.
add
(
c
.
getEndPoint
().
get
(
1
));
}
else
if
(
component
.
equals
(
c
.
getEndPoint
().
get
(
1
).
getComponent
().
getName
())
&&
gate
.
equals
(
c
.
getEndPoint
().
get
(
1
).
getGate
().
getName
()))
{
elements
.
add
(
c
.
getEndPoint
().
get
(
0
));
}
}
else
{
//TODO: handle?
}
}
// GateReference opposite = ((Message) context).getTarget().get(0).getTargetGate();
// if (c.getEndPoint().get(0) == opposite) {
// elements.add(c.getEndPoint().get(1));
// } else if (c.getEndPoint().get(1) == opposite) {
// elements.add(c.getEndPoint().get(0));
// }
}
else
if
(
context
instanceof
Target
)
{
GateReference
opposite
=
null
;
if
(
context
.
eContainer
()
instanceof
Message
)
{
opposite
=
((
Message
)
context
.
eContainer
()).
getSourceGate
();
}
else
{
opposite
=
((
ProcedureCall
)
context
.
eContainer
()).
getSourceGate
();
}
if
(
c
.
getEndPoint
().
get
(
0
)
==
opposite
)
{
elements
.
add
(
c
.
getEndPoint
().
get
(
1
));
}
else
if
(
c
.
getEndPoint
().
get
(
1
)
==
opposite
)
{
elements
.
add
(
c
.
getEndPoint
().
get
(
0
));
}
}
else
{
elements
.
addAll
(
c
.
getEndPoint
());
}
}
IScope
scope
=
Scopes
.
scopeFor
(
elements
,
new
Function
<
EObject
,
QualifiedName
>()
{
@Override
public
QualifiedName
apply
(
EObject
o
)
{
GateReference
r
=
(
GateReference
)
o
;
String
n
=
r
.
getComponent
().
getName
()+
"."
+
r
.
getGate
().
getName
();
QualifiedName
qualifiedName
=
qualifiedNameConverter
.
toQualifiedName
(
n
);
return
qualifiedName
;
}
},
IScope
.
NULLSCOPE
);
return
scope
;
}
}
else
if
(
Parameter
.
class
.
isAssignableFrom
(
reference
.
getEType
().
getInstanceClass
()))
{
if
(
context
instanceof
MemberAssignment
)
{
if
(
context
.
eContainer
()
instanceof
StructuredDataInstance
&&
((
StructuredDataInstance
)
context
.
eContainer
()).
getDataType
()
instanceof
StructuredDataType
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
StructuredDataInstance
)
context
.
eContainer
()).
getDataType
()).
allMembers
());
return
scope
;
}
}
else
if
(
context
instanceof
ParameterMapping
)
{
if
(
context
.
eContainer
()
instanceof
DataElementMapping
)
{
if
(((
DataElementMapping
)
context
.
eContainer
()).
getMappableDataElement
()
instanceof
StructuredDataType
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
DataElementMapping
)
context
.
eContainer
()).
getMappableDataElement
()).
allMembers
());
return
scope
;
}
else
if
(((
DataElementMapping
)
context
.
eContainer
()).
getMappableDataElement
()
instanceof
Action
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
Action
)((
DataElementMapping
)
context
.
eContainer
()).
getMappableDataElement
()).
getFormalParameter
());
return
scope
;
}
}
}
else
if
(
context
instanceof
ParameterBinding
)
{
if
(
context
.
eContainer
()
instanceof
DataInstanceUse
)
{
if
(((
DataInstanceUse
)
context
.
eContainer
()).
getDataInstance
()
instanceof
StructuredDataInstance
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
StructuredDataInstance
)((
DataInstanceUse
)
context
.
eContainer
()).
getDataInstance
()).
getDataType
()).
allMembers
());
return
scope
;
}
else
if
(((
DataInstanceUse
)
context
.
eContainer
()).
getDataType
()
instanceof
StructuredDataType
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
DataInstanceUse
)
context
.
eContainer
()).
getDataType
()).
allMembers
());
return
scope
;
}
else
if
(
context
.
eContainer
().
eContainer
()
instanceof
MemberAssignment
)
{
DataType
dataType
=
((
MemberAssignment
)
context
.
eContainer
()
.
eContainer
())
.
getMember
()
.
getDataType
();
if
(
dataType
!=
null
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)
dataType
)
.
allMembers
());
return
scope
;
}
}
else
if
(
context
.
eContainer
().
eContainer
()
instanceof
ParameterBinding
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
ParameterBinding
)
context
.
eContainer
().
eContainer
()).
getParameter
().
getDataType
()).
allMembers
());
return
scope
;
}
}
else
if
(
context
.
eContainer
()
instanceof
FunctionCall
)
{
// if (((FunctionCall)context.eContainer()).getFunction().get instanceof StructuredDataInstance) {
IScope
scope
=
Scopes
.
scopeFor
(((
FunctionCall
)
context
.
eContainer
()).
getFunction
().
getFormalParameter
());
return
scope
;
// }
}
else
if
(
context
.
eContainer
()
instanceof
ActionReference
)
{
// if (((FunctionCall)context.eContainer()).getFunction().get instanceof StructuredDataInstance) {
IScope
scope
=
Scopes
.
scopeFor
(((
ActionReference
)
context
.
eContainer
()).
getAction
().
getFormalParameter
());
return
scope
;
// }
}
else
if
(
context
.
eContainer
()
instanceof
TestDescriptionReference
)
{
// if (((FunctionCall)context.eContainer()).getFunction().get instanceof StructuredDataInstance) {
IScope
scope
=
Scopes
.
scopeFor
(((
TestDescriptionReference
)
context
.
eContainer
()).
getTestDescription
().
getFormalParameter
());
return
scope
;
// }
}
else
if
(
context
.
eContainer
()
instanceof
FormalParameterUse
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
FormalParameterUse
)
context
.
eContainer
()).
getParameter
().
getDataType
()).
allMembers
());
return
scope
;
}
else
if
(
context
.
eContainer
()
instanceof
VariableUse
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
VariableUse
)
context
.
eContainer
()).
getVariable
().
getDataType
()).
allMembers
());
return
scope
;
}
else
if
(
context
.
eContainer
()
instanceof
ProcedureCall
)
{
// if (((FunctionCall)context.eContainer()).getFunction().get instanceof StructuredDataInstance) {
IScope
scope
=
Scopes
.
scopeFor
(((
ProcedureCall
)
context
.
eContainer
()).
getSignature
().
getParameter
());
return
scope
;
// }
}
}
else
if
(
context
instanceof
MemberReference
)
{
if
(((
DataUse
)
context
.
eContainer
()).
getReduction
().
indexOf
(
context
)>
0
)
{
EObject
targetContext
=
((
DataUse
)
context
.
eContainer
()).
getReduction
().
get
(((
DataUse
)
context
.
eContainer
()).
getReduction
().
indexOf
(
context
)-
1
);
if
(((
MemberReference
)
targetContext
).
getMember
()!=
null
)
{
if
(((
MemberReference
)
targetContext
).
getMember
().
getDataType
()
instanceof
StructuredDataType
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
MemberReference
)
targetContext
).
getMember
().
getDataType
()).
allMembers
());
return
scope
;
}
}
}
if
(
context
.
eContainer
()
instanceof
DataInstanceUse
)
{
if
(((
DataInstanceUse
)
context
.
eContainer
()).
getDataInstance
()
instanceof
StructuredDataInstance
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
StructuredDataInstance
)((
DataInstanceUse
)
context
.
eContainer
()).
getDataInstance
()).
getDataType
()).
allMembers
());
return
scope
;
}
}
else
if
(
context
.
eContainer
()
instanceof
FunctionCall
)
{
if
(((
FunctionCall
)
context
.
eContainer
()).
getFunction
().
getReturnType
()
instanceof
StructuredDataType
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
FunctionCall
)
context
.
eContainer
()).
getFunction
().
getReturnType
()).
allMembers
());
return
scope
;
}
}
else
if
(
context
.
eContainer
()
instanceof
FormalParameterUse
)
{
if
(((
FormalParameterUse
)
context
.
eContainer
()).
getParameter
().
getDataType
()
instanceof
StructuredDataType
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
FormalParameterUse
)
context
.
eContainer
()).
getParameter
().
getDataType
()).
allMembers
());
return
scope
;
}
}
else
if
(
context
.
eContainer
()
instanceof
VariableUse
)
{
if
(((
VariableUse
)
context
.
eContainer
()).
getVariable
().
getDataType
()
instanceof
StructuredDataType
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
VariableUse
)
context
.
eContainer
()).
getVariable
().
getDataType
()).
allMembers
());
return
scope
;
}
}
else
{
}
}
}
else
if
(
reference
.
getEType
().
getInstanceClass
()
==
Variable
.
class
)
{
if
(
context
instanceof
Assignment
)
{
if
(((
Assignment
)
context
).
getComponentInstance
()!=
null
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
Assignment
)
context
).
getComponentInstance
().
getType
().
allVariables
());
return
scope
;
}
}
if
(
context
instanceof
VariableUse
)
{
if
(((
VariableUse
)
context
).
getComponentInstance
()!=
null
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
VariableUse
)
context
).
getComponentInstance
().
getType
().
allVariables
());
return
scope
;
}
}
else
if
(
context
instanceof
ValueAssignment
)
{
if
(((
Target
)
context
.
eContainer
()).
getTargetGate
().
getComponent
()!=
null
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
Target
)
context
.
eContainer
()).
getTargetGate
().
getComponent
().
getType
().
allVariables
());
return
scope
;
}
}
}
else
if
(
reference
.
getEType
().
getInstanceClass
()
==
Timer
.
class
)
{
if
(
context
instanceof
TimerOperation
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
TimerOperation
)
context
).
getComponentInstance
().
getType
().
allTimers
());
return
scope
;
}
}
else
if
(
context
instanceof
Extension
)
{
EList
<
EObject
>
elements
=
getScopedElementsOfType
(
context
,
((
Element
)
context
.
eContainer
()).
getClass
());
return
Scopes
.
scopeFor
(
elements
);
}
else
{
}
if
(
context
instanceof
Block
)
{
TestDescription
testDescription
=
getTestDescription
((
Element
)
context
);
if
(
testDescription
!=
null
)
{
TestConfiguration
configuration
=
testDescription
.
getTestConfiguration
();
IScope
scope
=
Scopes
.
scopeFor
(
configuration
.
getComponentInstance
());
return
scope
;
}
}
return
super
.
getScope
(
context
,
reference
);
}
private
TestConfiguration
getTestConfiguration
(
Element
self
)
{
if
(
self
.
eContainer
()!=
null
)
{
if
(!(
self
.
eContainer
()
instanceof
TestConfiguration
))
{
return
getTestConfiguration
((
Element
)
self
.
eContainer
());
}
else
{
return
(
TestConfiguration
)
self
.
eContainer
();
}
}
return
null
;
}
private
TestDescription
getTestDescription
(
Element
self
)
{
if
(
self
.
eContainer
()!=
null
)
{
if
(!(
self
.
eContainer
()
instanceof
TestDescription
))
{
return
getTestDescription
((
Element
)
self
.
eContainer
());
}
else
{
return
(
TestDescription
)
self
.
eContainer
();
}
}
return
null
;
}
public
IScope
scope_ElementImport_importedElement
(
ElementImport
context
,
EReference
ref
)
{
EList
<
EObject
>
elements
=
new
BasicEList
<>();
Package
ip
=
context
.
getImportedPackage
();
for
(
PackageableElement
e
:
ip
.
getPackagedElement
())
{
elements
.
add
(
e
);
}
IScope
scope
=
Scopes
.
scopeFor
(
elements
);
return
scope
;
}
private
Package
getPackage
(
EObject
e
)
{
if
(
e
.
eContainer
()!=
null
)
{
if
(
e
.
eContainer
()
instanceof
Package
)
{
return
(
Package
)
e
.
eContainer
();
}
else
{
return
getPackage
(
e
.
eContainer
());
}
}
else
{
return
(
Package
)
e
;
}
}
private
EList
<
EObject
>
getScopedElementsOfType
(
EObject
context
,
Class
c
)
{
EList
<
EObject
>
elements
=
new
BasicEList
<>();
Package
p
=
getPackage
(
context
);
//within same package
for
(
PackageableElement
e
:
p
.
getPackagedElement
())
{
if
(
c
.
isInstance
(
e
))
{
elements
.
add
(
e
);
}
}
//within imported packages
for
(
ElementImport
i
:
p
.
getImport
())
{
Package
ip
=
i
.
getImportedPackage
();
if
(
ip
!=
null
)
{
if
(
i
.
getImportedElement
().
isEmpty
())
{
//import all
for
(
PackageableElement
e
:
ip
.
getPackagedElement
())
{
if
(
c
.
isInstance
(
e
))
{
elements
.
add
(
e
);
}
}
}
else
{
//specific imports
for
(
PackageableElement
e
:
i
.
getImportedElement
())
{
if
(
c
.
isInstance
(
e
))
{
elements
.
add
(
e
);
}
}
}
}
}
return
elements
;
}
}
\ No newline at end of file
plugins/org.etsi.mts.tdl.TPLan2/META-INF/MANIFEST.MF
View file @
5b04e6cf
...
...
@@ -12,7 +12,8 @@ Require-Bundle: org.etsi.mts.tdl.model,
org.eclipse.xtext.xbase.lib;bundle-version="2.14.0",
org.eclipse.xtext.util,
org.eclipse.xtend.lib,
org.antlr.runtime;bundle-version="[3.2.0,3.2.1)"
org.antlr.runtime;bundle-version="[3.2.0,3.2.1)",
org.etsi.mts.tdl.common
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Export-Package: org.etsi.mts.tdl.scoping,
org.etsi.mts.tdl,
...
...
plugins/org.etsi.mts.tdl.TPLan2/src/org/etsi/mts/tdl/TPLan2.xtext
View file @
5b04e6cf
...
...
@@ -62,7 +62,7 @@ ElementImport returns tdl::ElementImport:
|
(importedElement+=[tdl::PackageableElement|Identifier] ( "," importedElement+=[tdl::PackageableElement|Identifier])*)
)
'from' importedPackage=[tdl::Package|Identifier]
'from'
(
importedPackage=[tdl::Package|Identifier]
| importedPackage=[tdl::Package|QIdentifier])
';';
Group returns tdl::Package:
...
...
@@ -582,6 +582,7 @@ OmitValue returns tdl::OmitValue:
'omitted'
;
ParameterBinding returns tdl::ParameterBinding:
parameter=[tdl::Parameter|Identifier]
(comment+=NotQualifier)?
...
...
@@ -841,6 +842,9 @@ BindingDataReference returns to::DataReference:
content=StaticDataUse
;
QIdentifier returns ecore::EString:
ID ('.' ID)+
;
terminal ID : '^'?('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'/')*;
...
...
plugins/org.etsi.mts.tdl.TPLan2/src/org/etsi/mts/tdl/scoping/TPLan2ScopeProvider.java
View file @
5b04e6cf
...
...
@@ -52,56 +52,21 @@ import com.google.inject.Inject;
* See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping
* on how and when to use it.
*/
public
class
TPLan2ScopeProvider
extends
AbstractDeclarative
ScopeProvider
{
public
class
TPLan2ScopeProvider
extends
TDL
ScopeProvider
{
@Inject
private
IQualifiedNameConverter
qualifiedNameConverter
;
@Override
public
IScope
getScope
(
EObject
context
,
EReference
reference
)
{
if
(
PackageableElement
.
class
.
isAssignableFrom
(
reference
.
getEType
().
getInstanceClass
())
&&
!(
context
instanceof
ElementImport
))
{
EList
<
EObject
>
elements
=
getScopedElementsOfType
(
context
,
reference
.
getEType
().
getInstanceClass
());
IScope
scope
=
Scopes
.
scopeFor
(
elements
);
return
scope
;
}
if
(
reference
.
getEType
().
getInstanceClass
()
==
GateInstance
.
class
)
{
if
(
context
instanceof
GateReference
)
{
GateReference
gate
=
(
GateReference
)
context
;
if
(
gate
.
getComponent
().
getType
()!=
null
)
{
IScope
scope
=
Scopes
.
scopeFor
(
gate
.
getComponent
().
getType
().
getGateInstance
());
return
scope
;
}
}
}
else
if
(
Parameter
.
class
.
isAssignableFrom
(
reference
.
getEType
().
getInstanceClass
()))
{
if
(
context
instanceof
MemberAssignment
)
{
if
(
context
.
eContainer
()
instanceof
StructuredDataInstance
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
StructuredDataInstance
)
context
.
eContainer
()).
getDataType
()).
allMembers
());
return
scope
;
}
}
else
if
(
context
instanceof
ParameterBinding
)
{
if
(
context
.
eContainer
()
instanceof
DataInstanceUse
)
{
if
(((
DataInstanceUse
)
context
.
eContainer
()).
getDataInstance
()
instanceof
StructuredDataInstance
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
StructuredDataInstance
)((
DataInstanceUse
)
context
.
eContainer
()).
getDataInstance
()).
getDataType
()).
allMembers
());
return
scope
;
}
}
}
else
if
(
context
instanceof
MemberReference
)
{
if
(((
DataUse
)
context
.
eContainer
()).
getReduction
().
indexOf
(
context
)>
0
)
{
EObject
targetContext
=
((
DataUse
)
context
.
eContainer
()).
getReduction
().
get
(((
DataUse
)
context
.
eContainer
()).
getReduction
().
indexOf
(
context
)-
1
);
if
(((
MemberReference
)
targetContext
).
getMember
()!=
null
)
{
if
(((
MemberReference
)
targetContext
).
getMember
().
getDataType
()
instanceof
StructuredDataType
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
MemberReference
)
targetContext
).
getMember
().
getDataType
()).
allMembers
());
return
scope
;
}
}
}
if
(
context
.
eContainer
()
instanceof
DataInstanceUse
)
{
if
(((
DataInstanceUse
)
context
.
eContainer
()).
getDataInstance
()
instanceof
StructuredDataInstance
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
StructuredDataInstance
)((
DataInstanceUse
)
context
.
eContainer
()).
getDataInstance
()).
getDataType
()).
allMembers
());
return
scope
;
}
}
}
else
if
(
context
instanceof
Content
)
{
// if (PackageableElement.class.isAssignableFrom(reference.getEType().getInstanceClass())
// && !(context instanceof ElementImport)) {
// EList<EObject> elements = getScopedElementsOfType(context, reference.getEType().getInstanceClass());
// IScope scope = Scopes.scopeFor(elements);
// return scope;
// }
if
(
Parameter
.
class
.
isAssignableFrom
(
reference
.
getEType
().
getInstanceClass
()))
{
if
(
context
instanceof
Content
)
{
if
(
context
.
eContainer
()
instanceof
LiteralValue
)
{
if
(((
LiteralValue
)
context
.
eContainer
()).
getDataType
()
instanceof
StructuredDataType
)
{
IScope
scope
=
Scopes
.
scopeFor
(((
StructuredDataType
)((
LiteralValue
)
context
.
eContainer
()).
getDataType
()).
allMembers
());
...
...
@@ -143,61 +108,4 @@ public class TPLan2ScopeProvider extends AbstractDeclarativeScopeProvider {
IScope
scope
=
super
.
getScope
(
context
,
reference
);
return
scope
;
}
public
IScope
scope_ElementImport_importedElement
(
ElementImport
context
,
EReference
ref
)
{
EList
<
EObject
>
elements
=
new
BasicEList
<>();
Package
ip
=
context
.
getImportedPackage
();
for
(
PackageableElement
e
:
ip
.
getPackagedElement
())
{
elements
.
add
(
e
);
}
IScope
scope
=
Scopes
.
scopeFor
(
elements
);
return
scope
;
}
private
Package
getPackage
(
EObject
e
)
{
if
(
e
.
eContainer
()!=
null
)
{
if
(
e
.
eContainer
()
instanceof
Package
)
{
return
(
Package
)
e
.
eContainer
();
}
else
{
return
getPackage
(
e
.
eContainer
());
}
}
else
{
return
(
Package
)
e
;
}
}
private
EList
<
EObject
>
getScopedElementsOfType
(
EObject
context
,
Class
c
)
{
EList
<
EObject
>
elements
=
new
BasicEList
<>();
Package
p
=
getPackage
(
context
);
//within same package
for
(
PackageableElement
e
:
p
.
getPackagedElement
())
{
if
(
c
.
isInstance
(
e
))
{
elements
.
add
(
e
);
}
}
//within imported packages
for
(
ElementImport
i
:
p
.
getImport
())
{
Package
ip
=
i
.
getImportedPackage
();
if
(
ip
!=
null
)
{
if
(
i
.
getImportedElement
().
isEmpty
())
{
//import all
for
(
PackageableElement
e
:
ip
.
getPackagedElement
())
{
if
(
c
.
isInstance
(
e
))
{
elements
.
add
(
e
);
}
}
}
else
{
//specific imports
for
(
PackageableElement
e
:
i
.
getImportedElement
())
{
if
(
c
.
isInstance
(
e
))
{
elements
.
add
(
e
);
}
}
}
}
}
return
elements
;
}
}