Commit f16e23aa authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ updates for v4.8.1 (#26)

+ correspondning updates for scoping, validation
+ fix for scope resolution in IDE
parent b0f9d341
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ import de.ugoe.cs.swe.scoping.TTCN3GlobalScopeProvider;
public class T3Q {
	//TODO: externalise meta-data
	private static String versionNumber = "v2.1.0b2";
	private static String supportedTTCN3Version = "4.7.1";
	private static String supportedTTCN3Version = "4.8.1";
	// set during automated server builds -> no longer displayed or used..
	private static String buildStamp = "---BUILD_STAMP---";
	public static QualityCheckProfile activeProfile = null;
+51 −27
Original line number Diff line number Diff line
@@ -70,8 +70,8 @@ public class ScopeRebuild extends BuilderParticipant {
//
//			//generator.doGenerate(context.getResourceSet(), fileSystemAccess);
//		}
		
		
		boolean reset = false;
		if (reset) {
			TTCN3GlobalScopeProvider.RESOURCES.clear();
			TTCN3GlobalScopeProvider.NAMED_MODULES.clear();
			TTCN3GlobalScopeProvider.EXPORTED_OBJECTS.clear();
@@ -105,6 +105,30 @@ public class ScopeRebuild extends BuilderParticipant {
					e.printStackTrace();
				}
			}
		} else {
			Resource r = resource;
			TTCN3Module module = CommonHelper.getModule(r);
			//TODO: remove old resource? -> seems like no need
			TTCN3GlobalScopeProvider.RESOURCES.add(r);
			TTCN3GlobalScopeProvider.NAMED_MODULES.put(module.getName(), module);
			TTCN3GlobalScopeProvider.initExportedObjects(r);
			PreAnalyzer p = new PreAnalyzer(r);
			try {
				p.call();
			} catch (Exception e) {
				e.printStackTrace();
			}
			//TODO: refreshing a bit laggy
//			//TODO: rerun on others?
//			for (int i = 0; i < TTCN3GlobalScopeProvider.RESOURCES.size(); i++) {
//				PreAnalyzer pa = new PreAnalyzer(TTCN3GlobalScopeProvider.RESOURCES.get(i));
//				try {
//					pa.call();
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//			}
		}
			
		TTCN3StatisticsProvider.getInstance().setPreAnalyzingCompleted(true);
		buildSemaphor.set(false);
+94 −40
Original line number Diff line number Diff line
@@ -262,7 +262,7 @@ GotoStatement:
	GOTOKEYWORD name=IDENTIFIER;

ReturnStatement:
	{ReturnStatement} RETURNKEYWORD (template=InLineTemplate | expression=Expression)?;
	{ReturnStatement} RETURNKEYWORD (template=TemplateInstance)?;

InterleavedConstruct:
	INTERLEAVEDKEYWORD LBRACKET InterleavedGuardList RBRACKET;
@@ -335,7 +335,7 @@ CheckPortOpsPresent:
	PortReceiveOp | PortGetCallOp | PortGetReplyOp | PortCatchOp;

PortGetReplyOp:
	{PortGetReplyOp} GETREPLYOPKEYWORD (LPAREN template=InLineTemplate value=ValueMatchSpec? RPAREN)? from=FromClause?
	{PortGetReplyOp} GETREPLYOPKEYWORD (LPAREN template=TemplateInstance value=ValueMatchSpec? RPAREN)? from=FromClause?
	redirect=PortRedirectWithValueAndParam?;

PortRedirectWithValueAndParam:
@@ -345,7 +345,7 @@ RedirectWithValueAndParamSpec:
	value=ValueSpec param=ParamSpec? sender=SenderSpec? index=IndexSpec? | redirect=RedirectWithParamSpec;

ValueMatchSpec:
	VALUEKEYWORD template=InLineTemplate;
	VALUEKEYWORD template=TemplateInstance;

CatchStatement:
	PortOrAny DOT catch=PortCatchOp;
@@ -354,13 +354,13 @@ PortCatchOp:
	{PortCatchOp} CATCHOPKEYWORD (LPAREN param=CatchOpParameter RPAREN)? from=FromClause? redirect=PortRedirect?;

CatchOpParameter:
	signature=Signature COMMA template=InLineTemplate | {CatchOpParameter} TIMEOUTKEYWORD;
	signature=Signature COMMA template=TemplateInstance | {CatchOpParameter} TIMEOUTKEYWORD;

GetCallStatement:
	PortOrAny DOT call=PortGetCallOp;

PortGetCallOp:
	{PortGetCallOp} GETCALLOPKEYWORD (LPAREN template=InLineTemplate RPAREN)? from=FromClause?
	{PortGetCallOp} GETCALLOPKEYWORD (LPAREN template=TemplateInstance RPAREN)? from=FromClause?
	redirect=PortRedirectWithParam?;

PortRedirectWithParam:
@@ -392,7 +392,7 @@ TriggerStatement:
	PortOrAny DOT trigger=PortTriggerOp;

PortTriggerOp:
	{PortTriggerOp} TRIGGEROPKEYWORD (LPAREN template=InLineTemplate RPAREN)? from=FromClause? redirect=PortRedirect?;
	{PortTriggerOp} TRIGGEROPKEYWORD (LPAREN template=TemplateInstance RPAREN)? from=FromClause? redirect=PortRedirect?;

ReceiveStatement:
	any=PortOrAny DOT receive=PortReceiveOp;
@@ -403,13 +403,13 @@ PortOrAny:
	variable=VariableRef));

PortReceiveOp:
	{PortReceiveOp} RECEIVEOPKEYWORD (LPAREN template=InLineTemplate RPAREN)? from=FromClause? redirect=PortRedirect?;
	{PortReceiveOp} RECEIVEOPKEYWORD (LPAREN template=TemplateInstance RPAREN)? from=FromClause? redirect=PortRedirect?;

FromClause:
	{FromClause} FROMKEYWORD (template=InLineTemplate | addresses=AddressRefList | ANYKEYWORD COMPONENTKEYWORD);
	{FromClause} FROMKEYWORD (template=TemplateInstance | addresses=AddressRefList | ANYKEYWORD COMPONENTKEYWORD);

AddressRefList:
	LPAREN templates+=InLineTemplate (COMMA templates+=InLineTemplate)* RPAREN;
	LPAREN templates+=TemplateInstance (COMMA templates+=TemplateInstance)* RPAREN;

PortRedirect:
	PORTREDIRECTSYMBOL ((value=ValueSpec sender=SenderSpec? index=IndexSpec?) | (sender=SenderSpec index=IndexSpec?) |
@@ -442,9 +442,13 @@ FunctionInstance:
// ext ref ok?
// usage / semantic of PreDefFunctionIdentifier?
FunctionRef:
	FunctionDef | ExtFunctionDef | BaseTemplate | AltstepDef;
	FunctionDef | ExtFunctionDef | BaseTemplate | AltstepDef | Enumeration;
	//(IDENTIFIER DOT)? IDENTIFIER;

TemplateRef:
	BaseTemplate | Enumeration | FormalTemplatePar | FormalValuePar | SingleTempVarInstance;


FunctionActualParList:
	(params+=FunctionActualPar (COMMA params+=FunctionActualPar)*) | (asssign+=FunctionActualParAssignment (COMMA
	asssign+=FunctionActualParAssignment)*);
@@ -469,7 +473,7 @@ TimerRefAssignment:
	timer=[FormalTimerPar|IDENTIFIER] ASSIGNMENTCHAR value=[TimerVarInstance|IDENTIFIER];

FunctionActualPar:
	template=InLineTemplate | component=ComponentRef | timer=[TimerVarInstance|IDENTIFIER] | port=PortRef |
	template=TemplateInstance | component=ComponentRef | timer=[TimerVarInstance|IDENTIFIER] | port=PortRef |
	{FunctionActualPar} MINUS;

ComponentRef:
@@ -522,7 +526,7 @@ FunctionStatement:
	test=TestcaseOperation;

TestcaseOperation:
	{TestcaseOperation} TESTCASEKEYWORD DOT STOPKEYWORD (LPAREN ((txt+=FREE_TEXT | template+=InLineTemplate) COMMA?)*
	{TestcaseOperation} TESTCASEKEYWORD DOT STOPKEYWORD (LPAREN (log+=LogItem COMMA?)*
	RPAREN)?;

SetLocalVerdict:
@@ -545,7 +549,7 @@ ComponentReferenceOrLiteral:
	ref=ComponentOrDefaultReference | {ComponentReferenceOrLiteral} MTCKEYWORD | {ComponentReferenceOrLiteral} SELFOP;

StartTCStatement:
	ref=ComponentOrDefaultReference DOT STARTKEYWORD LPAREN function=FunctionInstance RPAREN;
	ref=ComponentOrDefaultReference DOT STARTKEYWORD LPAREN (function=FunctionInstance | altstep=AltstepInstance) RPAREN;

UnmapStatement:
	{UnmapStatement} UNMAPKEYWORD (spec=SingleConnectionSpec clause=ParamClause? | spec=AllConnectionsSpec
@@ -610,16 +614,16 @@ RaiseStatement:
	port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortRaiseOp;

PortRaiseOp:
	RAISEKEYWORD LPAREN signature=[SignatureDef|QualifiedIdentifier] COMMA template=InLineTemplate RPAREN to=ToClause?;
	RAISEKEYWORD LPAREN signature=[SignatureDef|QualifiedIdentifier] COMMA template=TemplateInstance RPAREN to=ToClause?;

ReplyStatement:
	port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortReplyOp;

PortReplyOp:
	REPLYKEYWORD LPAREN template=InLineTemplate value=ReplyValue? RPAREN to=ToClause?;
	REPLYKEYWORD LPAREN template=TemplateInstance value=ReplyValue? RPAREN to=ToClause?;

ReplyValue:
	VALUEKEYWORD expr=Expression;
	VALUEKEYWORD body=TemplateBody;

CallStatement:
	port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortCallOp body=PortCallBody?;
@@ -628,7 +632,7 @@ PortCallOp:
	CALLOPKEYWORD LPAREN params=CallParameters RPAREN to=ToClause?;

CallParameters:
	template=InLineTemplate (COMMA value=CallTimerValue)?;
	template=TemplateInstance (COMMA value=CallTimerValue)?;

CallTimerValue:
	expr=Expression | {CallTimerValue} NOWAITKEYWORD;
@@ -653,10 +657,10 @@ SendStatement:
	port=[FormalPortAndValuePar|IDENTIFIER] arryRefs+=ArrayOrBitRef* DOT send=PortSendOp;

PortSendOp:
	SENDOPKEYWORD LPAREN template=InLineTemplate RPAREN to=ToClause?;
	SENDOPKEYWORD LPAREN template=TemplateInstance RPAREN to=ToClause?;

ToClause:
	{ToClause} TOKEYWORD (template=InLineTemplate | ref=AddressRefList | ALLKEYWORD COMPONENTKEYWORD);
	{ToClause} TOKEYWORD (template=TemplateInstance | ref=AddressRefList | ALLKEYWORD COMPONENTKEYWORD);

FunctionDefList:
	(locDef=FunctionLocalDef | locInst=FunctionLocalInst) ws=WithStatement? sc=SEMICOLON?;
@@ -849,7 +853,15 @@ EnumerationList:
	enums+=Enumeration (COMMA enums+=Enumeration)*;

Enumeration:
	name=IDENTIFIER (LPAREN MINUS? NUMBER RPAREN)?;
	name=IDENTIFIER (LPAREN values+=IntegerValueOrRange (COMMA values+=IntegerValueOrRange)* RPAREN)?;

IntegerValueOrRange:
	lower=IntegerValue (RANGEOP upper=IntegerValue)?
;

IntegerValue:
	MINUS? NUMBER
;

UnionFieldDef:
	(type=Type | nestedType=NestedTypeDef) name=IDENTIFIER array=ArrayDef? subType=SubTypeSpec?;
@@ -909,7 +921,7 @@ SingleTempVarInstance:
	name=IDENTIFIER array=ArrayDef? (ac=ASSIGNMENTCHAR template=TemplateBody)?;

	/// changed Signature -> Type
InLineTemplate:
TemplateInstance:
	(type=Type COLON)? (derived=DerivedRefWithParList ASSIGNMENTCHAR)? template=TemplateBody;

DerivedRefWithParList:
@@ -928,30 +940,53 @@ FieldSpec:
	mod=FUZZY_MODIFIER? ref=[FieldReference|IDENTIFIER] ASSIGNMENTCHAR (body=TemplateBody | MINUS);

SimpleSpec:
	expr=SingleExpression (STRINGOP spec=SimpleTemplateSpec)? | spec=SimpleTemplateSpec;
	//TODO: flip order in case (with predicate?), 
	//		but test performance and correctness implications thoroughly
	//		-> seems to be necessary for enumeration with extension?
//	=>
//	spec=SimpleTemplateSpec
//	|
	=>expr=SingleExpression (STRINGOP spec=SimpleTemplateSpec)?
	|
	spec=SimpleTemplateSpec
	;

SimpleTemplateSpec:
	expr=SingleTemplateExpression (STRINGOP spec=SimpleSpec)?;

SingleTemplateExpression:
	symbol=MatchingSymbol | list=TemplateRefWithParList extended=ExtendedFieldReference?;
	//TODO: switch back order?
	//		-> keep for now otherwise it gets matched as TemplateRef with ParList
	//		-> test performance and correctness -> overshoots, treats everything as enum
	symbol=MatchingSymbol 
	| (list=TemplateRefWithParList extended=ExtendedFieldReference?)
	| =>(enumeration=[Enumeration|QualifiedIdentifier] extension=EnumTemplateExtension)
//	DONE: is it supposed to be a reference? -> yes
;

EnumTemplateExtension:
	{EnumTemplateExtension}
	LPAREN template+=TemplateBody (COMMA template+=TemplateBody)* RPAREN
;

	// TODO: test this!
TemplateRefWithParList:
	template=[BaseTemplate|QualifiedIdentifier] list=TemplateActualParList?;
	template=[TemplateRef|QualifiedIdentifier] list=TemplateActualParList?;

TemplateActualParList:
	{TemplateActualParList} LPAREN (actual+=TemplateInstanceActualPar (COMMA actual+=TemplateInstanceActualPar)* |
	assign+=TemplateInstanceAssignment (COMMA assign+=TemplateInstanceAssignment)*)? RPAREN;

MatchingSymbol:
	//TODO: switched to RangeDef instead of Range -> added both -> removed again 
	//		-> roll back once EnumTemplateExpression works properly? -> no need now 
	complement=Complement | {MatchingSymbol} any=QUESTIONMARK qwlm=WildcardLengthMatch? | {MatchingSymbol} anyornone=STAR
	swlm=WildcardLengthMatch? | range=Range | {MatchingSymbol} BIT_STRING_OR_MATCH | {MatchingSymbol} HEX_STRING_OR_MATCH
	| {MatchingSymbol} OCTET_STRING_OR_MATCH | string=CharStringMatch | subset=SubsetMatch | superset=SupersetMatch | decoded=DecodedContentMatch |
	templates=ListOfTemplates;

DecodedContentMatch:
	DECODED_MATCH  ( LPAREN Expression RPAREN )? template=InLineTemplate  
	DECODED_MATCH  ( LPAREN Expression RPAREN )? template=TemplateInstance  
;

SubsetMatch:
@@ -976,10 +1011,10 @@ TemplateOps:
	MatchOp | ValueofOp;

MatchOp:
	MATCHKEYWORD LPAREN expr=Expression COMMA template=InLineTemplate RPAREN;
	MATCHKEYWORD LPAREN expr=Expression COMMA template=TemplateInstance RPAREN;

ValueofOp:
	VALUEOFKEYWORD LPAREN template=InLineTemplate RPAREN;
	VALUEOFKEYWORD LPAREN template=TemplateInstance RPAREN;

ConfigurationOps:
	create=CreateOp | {ConfigurationOps} SELFOP | {ConfigurationOps} SYSTEMKEYWORD | {ConfigurationOps} MTCKEYWORD |
@@ -1012,10 +1047,10 @@ Signature:
	ref=[SignatureDef|QualifiedIdentifier];

TemplateInstanceAssignment:
	name=[BaseTemplate|IDENTIFIER] ASSIGNMENTCHAR template=InLineTemplate;
	name=[BaseTemplate|IDENTIFIER] ASSIGNMENTCHAR template=TemplateInstance;

TemplateInstanceActualPar:
	InLineTemplate | {TemplateInstanceActualPar} MINUS;
	TemplateInstance | {TemplateInstanceActualPar} MINUS;

TemplateRestriction:
	LPAREN (omit=OMITKEYWORD | value=VALUEKEYWORD | present=PRESENTKEYWORD) RPAREN;
@@ -1030,7 +1065,7 @@ LogStatement:
// This way seems to work and allows parsing constructs like: 
// log ( "*** f_1: INFO: OK - random value = " & bit2str(i1) & " ***" );
LogItem:
/*text=FREE_TEXT |*/ template=InLineTemplate;
/*text=FREE_TEXT |*/ template=TemplateInstance;

Expression:
	SingleExpression | CompoundExpression;
@@ -1113,7 +1148,11 @@ Value:
	predef=PredefinedValue | ref=ReferencedValue;

ReferencedValue:
	head=Head fields+=ExtendedFieldReference*;
	head=Head (fields+=ExtendedFieldReference+ | enumRef=ExtendedEnumReference)?;

ExtendedEnumReference:
	LPAREN value=IntegerValue RPAREN
;

RefValueHead:
	RefValue | ModuleOrGroup;
@@ -1146,7 +1185,9 @@ DecodedFieldType:
// SingleVarInstance contained in TimerVarInstance (according to EBNF rules)
RefValue:
	ModuleParameter | FieldReference | FormalTemplatePar | SingleTempVarInstance |
	FunctionRef | TimerVarInstance | FormalPortPar | PortElement | NamedObject;
	FunctionRef | TimerVarInstance | FormalPortPar | PortElement | NamedObject
//	| Enumeration //TODO: needed?	
;

	// IDENTIFIER omitted
PredefinedValue:
@@ -1289,12 +1330,17 @@ SelectCaseConstruct:
	SELECTKEYWORD (union=UNIONKEYWORD)? LPAREN expression=SingleExpression RPAREN body=SelectCaseBody;

SelectCaseBody:
	LBRACKET (cases+=SelectCase)+ RBRACKET;
	LBRACKET (cases+=SelectCase)+ else=CaseElse? RBRACKET;

SelectCase:
	CASEKEYWORD (LPAREN template+=InLineTemplate (COMMA template+=InLineTemplate)* RPAREN | else=ELSEKEYWORD)
	//TODO: check extra else?! -> likely redundant.. -> report issue 
	CASEKEYWORD (LPAREN template+=TemplateInstance (COMMA template+=TemplateInstance)* RPAREN | else=ELSEKEYWORD)
	statement=StatementBlock;

CaseElse:
	CASEKEYWORD ELSEKEYWORD statement=StatementBlock
;

FunctionDef:
	FUNCTIONKEYWORD det=DETERMINISTIC_MODIFIER? name=IDENTIFIER LPAREN parameterList=FunctionFormalParList? RPAREN
	runsOn=RunsOnSpec? mtc=MtcSpec?
@@ -1321,7 +1367,7 @@ FormalPortPar:

FormalTemplatePar:
	(inOut=(INPARKEYWORD | OUTPARKEYWORD | INOUTPARKEYWORD))? (TEMPLATEKEYWORD | restriction=RestrictedTemplate)
	(mod=LAZY_MODIFIER | mod=FUZZY_MODIFIER)? type=Type name=IDENTIFIER (ASSIGNMENTCHAR (templ=InLineTemplate | MINUS))?;
	(mod=LAZY_MODIFIER | mod=FUZZY_MODIFIER)? type=Type name=IDENTIFIER (ASSIGNMENTCHAR (templ=TemplateInstance | MINUS))?;

RunsOnSpec:
	RUNSKEYWORD ONKEYWORD component=[ComponentDef|QualifiedIdentifier];
@@ -1329,9 +1375,12 @@ RunsOnSpec:
ReturnType:
	RETURNKEYWORD (template=TEMPLATEKEYWORD | restricted=RestrictedTemplate)? type=Type;

	//TODO: try to remove extra=ExtraMatchingAttributes? from this rule 
	//TODO: try to remove extra=ExtraMatchingAttributes? from this rule -> removed?
	//		where does it come from? it is already in TemplateBody, perhaps it was parsed as expression by default?	 
Assignment:
	ref=VariableRef ASSIGNMENTCHAR (body=TemplateBody | expression=Expression) extra=ExtraMatchingAttributes?;
	ref=VariableRef ASSIGNMENTCHAR (body=TemplateBody) 
//	extra=ExtraMatchingAttributes?
	;

VariableRef:
	ref=ReferencedValue /*ext+=ExtendedFieldReference*/;
@@ -2019,13 +2068,13 @@ terminal fragment CHAR:
	DOLLAR | SINGLEQUOTE | '|' | SEMICOLON | CIRCUMFLEX | '~';

terminal HSTRING returns ecore::EString:
	SINGLEQUOTE HEX* SINGLEQUOTE 'H';
	SINGLEQUOTE (HEX | BINSPACE)* SINGLEQUOTE 'H';

terminal OSTRING returns ecore::EString:
	SINGLEQUOTE OCT* SINGLEQUOTE 'O';
	SINGLEQUOTE (OCT | BINSPACE)* SINGLEQUOTE 'O';

terminal BSTRING returns ecore::EString:
	SINGLEQUOTE BIN* SINGLEQUOTE 'B';
	SINGLEQUOTE (BIN | BINSPACE)* SINGLEQUOTE 'B';

terminal fragment UPPERALPHA:
	'A'..'Z';
@@ -2036,6 +2085,11 @@ terminal fragment LOWERALPHA:
terminal fragment BIN:
	'0' | '1';

//TODO: conflict? move after? merge with WS?
terminal BINSPACE:
	' ' | '\n'
;

terminal fragment ALPHA:
	UPPERALPHA | LOWERALPHA;

+43 −4
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import de.ugoe.cs.swe.tTCN3.FunctionFormalParList
import de.ugoe.cs.swe.tTCN3.FunctionInstance
import de.ugoe.cs.swe.tTCN3.GroupDef
import de.ugoe.cs.swe.tTCN3.Head
import de.ugoe.cs.swe.tTCN3.InLineTemplate
import de.ugoe.cs.swe.tTCN3.Initial
import de.ugoe.cs.swe.tTCN3.ModuleControlBody
import de.ugoe.cs.swe.tTCN3.ModuleControlPart
@@ -87,6 +86,9 @@ import de.ugoe.cs.swe.tTCN3.PortReceiveOp
import de.ugoe.cs.swe.tTCN3.Value
import org.eclipse.xtext.nodemodel.util.NodeModelUtils
import de.ugoe.cs.swe.tTCN3.Assignment
import de.ugoe.cs.swe.tTCN3.TemplateInstance
import de.ugoe.cs.swe.tTCN3.TemplateRefWithParList
import de.ugoe.cs.swe.tTCN3.SingleTemplateExpression

//TODO: switch to TTCN3LocalScopeProvider as base class?
class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
@@ -207,7 +209,7 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {

	private def Iterable<EObject> scopeListFieldExpressionList(EObject field) {
		val module = field.findDesiredParent(TTCN3Module)
		val inlineTemplate = field.findDesiredParent(InLineTemplate)
		val inlineTemplate = field.findDesiredParent(TemplateInstance)
		val template = field.findDesiredParent(TemplateDef)
		val variable = field.findDesiredParent(VarInstance)
		val eField = field.findDesiredParent(FieldExpressionSpec)
@@ -302,6 +304,13 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		field.scopeFieldExpressionList
	}

	def IScope scope_SingleTemplateExpression_enumeration(SingleTemplateExpression it, EReference enumeration) {
		var list = <EObject>newArrayList
		list.addAll(containedElementsOfType(TTCN3Package.eINSTANCE.enumeration))
		list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.enumeration))
		scopeFor(list)		
	}	

	def IScope scope_SingleValueSpec_fieldRef(SingleValueSpec spec, EReference ref) {
		//TODO: generalise / extract
		var ArrayList<EObject> list = newArrayList
@@ -323,6 +332,18 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
				}
				//TODO: others?
			}
		} else if (inlineTemplate.template !== null 
			&& inlineTemplate.template.simple !== null
			&& inlineTemplate.template.simple.spec !== null
			&& inlineTemplate.template.simple.spec.expr !== null
			&& inlineTemplate.template.simple.spec.expr.list !== null
		) {
			val t = inlineTemplate.template.simple.spec.expr.list.template
			if (t instanceof BaseTemplate) { 
				list.addAll(t.type.ref.scopeReferencedFields)
			} else if (t instanceof FormalTemplatePar) {
				list.addAll(t.type.ref.scopeReferencedFields)
			}
		} 
		scopeFor(list)		
	}
@@ -590,6 +611,8 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.extFunctionDef))
		list.addAll(containedElementsOfType(TTCN3Package.eINSTANCE.altstepDef))
		list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.altstepDef))
		list.addAll(containedElementsOfType(TTCN3Package.eINSTANCE.enumeration))
		list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.enumeration))
		//TODO: others?
		//TODO: hack for templates, need to be parsed differently in the first place, but not sure how..
		var containedTemplates = containedElementsOfType(TTCN3Package.eINSTANCE.moduleDefinition)
@@ -602,6 +625,22 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		return s
	}

	def IScope scope_TemplateRefWithParList_template(TemplateRefWithParList it, EReference template) {
		var list = <EObject>newArrayList
		list.addAll(containedElementsOfType(TTCN3Package.eINSTANCE.enumeration))
		list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.enumeration))
		var container = findDesiredParent(ModuleDefinition)
		list.addAll(container.eAllOfType(TTCN3Package.eINSTANCE.formalTemplatePar.instanceClass as Class<? extends EObject>))
		list.addAll(container.eAllOfType(TTCN3Package.eINSTANCE.formalValuePar.instanceClass as Class<? extends EObject>))
		var containedTemplates = containedElementsOfType(TTCN3Package.eINSTANCE.moduleDefinition)
			.filter[(it as ModuleDefinition).def instanceof TemplateDef]
			.map[((it as ModuleDefinition).def as TemplateDef).base]
		list.addAll(containedTemplates)
		var importedTemplates = importedElementsOfType(TTCN3Package.eINSTANCE.baseTemplate)
		list.addAll(importedTemplates)
		var s = scopeFor(list)
		return s
	}	

	//TODO: reuse and cache
	//TODO: check in IDE.. may need to be deactivated
+19 −6
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import de.ugoe.cs.swe.tTCN3.FunctionInstance
import de.ugoe.cs.swe.tTCN3.GotoStatement
import de.ugoe.cs.swe.tTCN3.GroupDef
import de.ugoe.cs.swe.tTCN3.ImportDef
import de.ugoe.cs.swe.tTCN3.InLineTemplate
import de.ugoe.cs.swe.tTCN3.LabelStatement
import de.ugoe.cs.swe.tTCN3.ModuleControlBody
import de.ugoe.cs.swe.tTCN3.ModuleDefinition
@@ -105,6 +104,7 @@ import static extension de.ugoe.cs.swe.common.TTCN3ReferenceHelper.*
import static extension de.ugoe.cs.swe.common.TTCN3ScopeHelper.*
import static extension org.eclipse.emf.ecore.util.EcoreUtil.*
import static extension org.eclipse.xtext.EcoreUtil2.*
import de.ugoe.cs.swe.tTCN3.TemplateInstance

class CheckDefinitionComeFirstParameter {
	public boolean hasOtherDefinitions
@@ -263,7 +263,7 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
	}

	@Check
	def checkInlineTemplates(InLineTemplate template) {
	def checkInlineTemplates(TemplateInstance template) {
		if (!activeProfile.checkInlineTemplates)
			return;

@@ -459,7 +459,20 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
			//TODO: export to reusable debugging dump
			//val debugNode = NodeModelUtils.findActualNodeFor(r.eContainer)
			//println(debugNode.startLine+" : "+debugNode.text)
			var v = (r.eContainer as ReferencedValue).referencedValue.name
			//TODO: fix casting issue
			var v = '';
			val c = r.eContainer
			if (c instanceof ReferencedValue) {
				v = c.referencedValue.name
			} else if (c instanceof SingleTemplateExpression) {
				if (c.enumeration !== null) {
					v = c.enumeration.name
					//TODO: return?
				} else {
					//TODO: return?
				}
//				v = c.
			}
			
			//DONE: distinguish between cases based on the assignment
			//negative distinction => exit scenarios
@@ -500,9 +513,9 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
			}
			
			//expression
			if (assignment.expression !== null) {
//			if (assignment.expression !== null) {
				//handle?
			}
//			}
			
			//extra?
			//TODO: handle?
@@ -1341,7 +1354,7 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
	}

	@Check
	def checkNoInlineTemplates(InLineTemplate template) {
	def checkNoInlineTemplates(TemplateInstance template) {
		if (!activeProfile.checkNoInlineTemplates)
			return;

Loading