Commit 032304d6 authored by Daniel Honsel's avatar Daniel Honsel
Browse files

fixed references to variable template fields

parent 95384ade
Loading
Loading
Loading
Loading
+15 −14
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ ConstDef:
	CONSTKEYWORD type=Type defs=ConstList;

Type:
	{Type} PredefinedType | ref=[ReferencedType|IDENTIFIER];
	pre=PredefinedType | ref=[ReferencedType|IDENTIFIER];

ArrayDef:
	(SQUAREOPEN expr+=SingleExpression (RANGEOP range+=SingleExpression)? SQUARECLOSE)+;
@@ -72,14 +72,15 @@ AllWithExcepts:
	{AllWithExcepts} ALLKEYWORD def=ExceptsDef?;

ExceptsDef:
	EXCEPTKEYWORD LBRACKET ExceptSpec RBRACKET;
	EXCEPTKEYWORD LBRACKET spec=ExceptSpec RBRACKET;

ExceptSpec:
	{ExceptSpec} (element+=ExceptElement SEMICOLON?)*;

ExceptElement:
	ExceptGroupSpec | ExceptTypeDefSpec | ExceptTemplateSpec | ExceptConstSpec | ExceptTestcaseSpec | ExceptAltstepSpec |
	ExceptFunctionSpec | ExceptSignatureSpec | ExceptModuleParSpec;
	group=ExceptGroupSpec | type=ExceptTypeDefSpec | template=ExceptTemplateSpec | const=ExceptConstSpec |
	testcase=ExceptTestcaseSpec | altstep=ExceptAltstepSpec | function=ExceptFunctionSpec | signature=ExceptSignatureSpec
	| modulePar=ExceptModuleParSpec;

IdentifierListOrAll:
	IdentifierList | ALLKEYWORD;
@@ -381,10 +382,10 @@ PortRedirect:
	PORTREDIRECTSYMBOL (value=ValueSpec sender=SenderSpec? | SenderSpec);

SenderSpec:
	SENDERKEYWORD VariableRef;
	SENDERKEYWORD variable=VariableRef;

ValueSpec:
	VALUEKEYWORD (VariableRef | (LPAREN specs+=SingleValueSpec (COMMA specs+=SingleValueSpec)* RPAREN));
	VALUEKEYWORD (variable=VariableRef | (LPAREN specs+=SingleValueSpec (COMMA specs+=SingleValueSpec)* RPAREN));

SingleValueSpec:
	variable=VariableRef (ASSIGNMENTCHAR field=[FieldReference|IDENTIFIER] ext+=ExtendedFieldReference*)?;
@@ -1048,7 +1049,7 @@ Value:
	PredefinedValue | ReferencedValue;

ReferencedValue:
	ref=[RefValue|IDENTIFIER] ext+=ExtendedFieldReference*;
	ref=[RefValue|IDENTIFIER] fieldRefs+=ExtendedFieldReference*;

RefValue:
	SingleConstDef | ModuleParameter | SingleVarInstance | FieldReference | FormalTemplatePar | SingleTempVarInstance;
@@ -1153,8 +1154,8 @@ PermutationMatch:
	PERMUTATIONKEYWORD list=ListOfTemplates;

ExtendedFieldReference:
	DOT (field+=ReferencedValue | type+=PredefinedType) | array+=ArrayOrBitRef | {ExtendedFieldReference} SQUAREOPEN
	MINUS SQUARECLOSE;
	DOT (field=[FieldReference|IDENTIFIER] | type=PredefinedType) | array=ArrayOrBitRef | {ExtendedFieldReference}
	SQUAREOPEN MINUS SQUARECLOSE;

LoopConstruct:
	forStm=ForStatement | whileStm=WhileStatement | doStm=DoWhileStatement;
@@ -1229,7 +1230,7 @@ Assignment:
	ref=VariableRef ASSIGNMENTCHAR (expression=Expression | body=TemplateBody);

VariableRef:
	ref=ReferencedValue ext+=ExtendedFieldReference*;
	ref=ReferencedValue /*ext+=ExtendedFieldReference*/;

	// Operators and special chars
AddOp returns ecore::EString:
@@ -1250,23 +1251,23 @@ RelOp returns ecore::EString:
ShiftOp returns ecore::EString:
	SHIFTLEFT | SHIFTRIGHT | ROTATELEFT | ROTATERIGHT;

PredefinedType:
PredefinedType returns ecore::EString:
	BITSTRINGKEYWORD | BOOLEANKEYWORD | CHARSTRINGKEYWORD | UniversalCharString | INTEGERKEYWORD | OCTETSTRINGKEYWORD |
	HEXSTRINGKEYWORD | VERDICTTYPEKEYWORD | FLOATKEYWORD | ADDRESSKEYWORD | DEFAULTKEYWORD | ANYTYPEKEYWORD;

UniversalCharString returns ecore::EString:
	UNIVERSALKEYWORD CHARSTRINGKEYWORD;

CharStringValue:
CharStringValue returns ecore::EString:
	CSTRING | Quadruple;

Quadruple returns ecore::EString:
	CHARKEYWORD LPAREN NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER RPAREN;

FloatValue:
FloatValue returns ecore::EString:
	FLOATDOTNOTATION | FLOATENOTATION | NANKEYWORD;

RANGEOP:
RANGEOP returns ecore::EString:
	DOT DOT;

FLOATDOTNOTATION returns ecore::EString hidden():
+57 −9
Original line number Diff line number Diff line
package de.ugoe.cs.swe.common

import de.ugoe.cs.swe.tTCN3.AltstepDef
import de.ugoe.cs.swe.tTCN3.AltstepLocalDef
import de.ugoe.cs.swe.tTCN3.AltstepLocalDefList
import de.ugoe.cs.swe.tTCN3.ComponentDef
@@ -14,24 +15,30 @@ import de.ugoe.cs.swe.tTCN3.Initial
import de.ugoe.cs.swe.tTCN3.ModuleControlPart
import de.ugoe.cs.swe.tTCN3.ModuleDefinition
import de.ugoe.cs.swe.tTCN3.ModuleDefinitionsList
import de.ugoe.cs.swe.tTCN3.ModulePar
import de.ugoe.cs.swe.tTCN3.ModuleParDef
import de.ugoe.cs.swe.tTCN3.ModuleParameter
import de.ugoe.cs.swe.tTCN3.PortElement
import de.ugoe.cs.swe.tTCN3.RecordDefNamed
import de.ugoe.cs.swe.tTCN3.RecordOfDefNamed
import de.ugoe.cs.swe.tTCN3.RefValue
import de.ugoe.cs.swe.tTCN3.ReferencedType
import de.ugoe.cs.swe.tTCN3.SetDefNamed
import de.ugoe.cs.swe.tTCN3.SetOfDefNamed
import de.ugoe.cs.swe.tTCN3.SignatureDef
import de.ugoe.cs.swe.tTCN3.SingleConstDef
import de.ugoe.cs.swe.tTCN3.SingleTempVarInstance
import de.ugoe.cs.swe.tTCN3.SingleVarInstance
import de.ugoe.cs.swe.tTCN3.StatementBlock
import de.ugoe.cs.swe.tTCN3.StructDefBody
import de.ugoe.cs.swe.tTCN3.StructFieldDef
import de.ugoe.cs.swe.tTCN3.TemplateDef
import de.ugoe.cs.swe.tTCN3.TemplateOrValueFormalPar
import de.ugoe.cs.swe.tTCN3.TemplateOrValueFormalParList
import de.ugoe.cs.swe.tTCN3.TypeDef
import de.ugoe.cs.swe.tTCN3.VarList
import java.util.ArrayList
import org.eclipse.emf.ecore.EObject
import de.ugoe.cs.swe.tTCN3.TypeDef
import de.ugoe.cs.swe.tTCN3.ModuleParDef
import de.ugoe.cs.swe.tTCN3.ModuleParameter
import de.ugoe.cs.swe.tTCN3.ModulePar
import de.ugoe.cs.swe.tTCN3.RecordOfDefNamed
import de.ugoe.cs.swe.tTCN3.SetOfDefNamed
import de.ugoe.cs.swe.tTCN3.AltstepDef
import de.ugoe.cs.swe.tTCN3.SingleTempVarInstance
import de.ugoe.cs.swe.tTCN3.TemplateDef

class TTCN3ScopeHelper {

@@ -227,4 +234,45 @@ class TTCN3ScopeHelper {
			componentScopeValueRefs(e, list, searchTimer, searchVar)
		}
	}

	def static void scopeReferencedFields(ReferencedType type, ArrayList<EObject> list) {
		if (type instanceof RecordDefNamed) {
			type.body.scopeFieldsStructDefBody(list)
		} else if (type instanceof SetDefNamed) {
			type.body.scopeFieldsStructDefBody(list)
		} else if (type instanceof RecordOfDefNamed) {
			//TODO: implement!
		} else if (type instanceof SetOfDefNamed) {
			//TODO: implement!
		}
	}

	def static void scopeFieldsStructDefBody(StructDefBody body, ArrayList<EObject> list) {
		for (StructFieldDef f : body.defs) {
			list.add(f)
		}
	}

	def static void templateFieldScope(TemplateDef template, ArrayList<EObject> list) {
		val type = template.base.type

		if (type != null && type.ref != null && typeof(RecordDefNamed).isAssignableFrom(type.ref.class)) {
			list.addAll((type.ref as RecordDefNamed).body.defs)
		}
		if (type != null && type.ref != null && typeof(SignatureDef).isAssignableFrom(type.ref.class)) {
			list.addAll((type.ref as SignatureDef).paramList.params)
		}
	}

	def static void componentScopePorts(ComponentDef component, ArrayList<EObject> list) {
		for (ComponentDefList l : component.defs.filter[it.element.port != null]) {
			for (PortElement e : l.element.port.instances) {
				list.add(e)
			}
		}
		for (ComponentDef e : component.extends) {
			componentScopePorts(e, list)
		}
	}

}
+32 −53
Original line number Diff line number Diff line
@@ -6,9 +6,11 @@ import de.ugoe.cs.swe.tTCN3.ComponentDef
import de.ugoe.cs.swe.tTCN3.ComponentDefList
import de.ugoe.cs.swe.tTCN3.ControlStatementOrDefList
import de.ugoe.cs.swe.tTCN3.EnumDefNamed
import de.ugoe.cs.swe.tTCN3.ExtendedFieldReference
import de.ugoe.cs.swe.tTCN3.FieldExpressionSpec
import de.ugoe.cs.swe.tTCN3.FieldSpec
import de.ugoe.cs.swe.tTCN3.ForStatement
import de.ugoe.cs.swe.tTCN3.FormalValuePar
import de.ugoe.cs.swe.tTCN3.FunctionDef
import de.ugoe.cs.swe.tTCN3.GroupDef
import de.ugoe.cs.swe.tTCN3.Initial
@@ -17,7 +19,6 @@ import de.ugoe.cs.swe.tTCN3.ModuleControlPart
import de.ugoe.cs.swe.tTCN3.ModuleDefinition
import de.ugoe.cs.swe.tTCN3.ModuleDefinitionsList
import de.ugoe.cs.swe.tTCN3.ModuleParDef
import de.ugoe.cs.swe.tTCN3.PortElement
import de.ugoe.cs.swe.tTCN3.PortOrAny
import de.ugoe.cs.swe.tTCN3.PortRef
import de.ugoe.cs.swe.tTCN3.RecordDefNamed
@@ -27,10 +28,9 @@ import de.ugoe.cs.swe.tTCN3.ReferencedValue
import de.ugoe.cs.swe.tTCN3.SendStatement
import de.ugoe.cs.swe.tTCN3.SetDefNamed
import de.ugoe.cs.swe.tTCN3.SetOfDefNamed
import de.ugoe.cs.swe.tTCN3.SignatureDef
import de.ugoe.cs.swe.tTCN3.SingleTempVarInstance
import de.ugoe.cs.swe.tTCN3.SingleVarInstance
import de.ugoe.cs.swe.tTCN3.StatementBlock
import de.ugoe.cs.swe.tTCN3.StructDefBody
import de.ugoe.cs.swe.tTCN3.StructFieldDef
import de.ugoe.cs.swe.tTCN3.StructuredTypeDef
import de.ugoe.cs.swe.tTCN3.TTCN3Module
@@ -40,8 +40,6 @@ import de.ugoe.cs.swe.tTCN3.TimerRefOrAny
import de.ugoe.cs.swe.tTCN3.TypeDef
import de.ugoe.cs.swe.tTCN3.UnionDefNamed
import de.ugoe.cs.swe.tTCN3.VarInstance
import java.util.ArrayList
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.xtext.scoping.IScope
import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider
@@ -160,16 +158,7 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		if (template != null) {
			template.templateFieldScope(inner)
		} else if (variable != null && variable.type.ref != null) {
			val type = variable.type.ref
			if (type instanceof RecordDefNamed) {
				type.body.scopeFieldsStructDefBody(inner)
			} else if (type instanceof SetDefNamed) {
				type.body.scopeFieldsStructDefBody(inner)
			} else if (type instanceof RecordOfDefNamed) {
				//TODO: implement!
			} else if (type instanceof SetOfDefNamed) {
				//TODO: implement!
			}
			variable.type.ref.scopeReferencedFields(inner)
		}
		scopeFor(inner)
	}
@@ -183,37 +172,11 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
			template.templateFieldScope(list)
		}
		if (variable != null && variable.type.ref != null) {
			val type = variable.type.ref
			if (type instanceof RecordDefNamed) {
				type.body.scopeFieldsStructDefBody(list)
			} else if (type instanceof SetDefNamed) {
				type.body.scopeFieldsStructDefBody(list)
			} else if (type instanceof RecordOfDefNamed) {
				//TODO: implement!
			} else if (type instanceof SetOfDefNamed) {
				//TODO: implement!
			}
			variable.type.ref.scopeReferencedFields(list)
		}
		scopeFor(list)
	}

	def private void scopeFieldsStructDefBody(StructDefBody body, ArrayList<EObject> list) {
		for (StructFieldDef f : body.defs) {
			list.add(f)
		}
	}

	def private void templateFieldScope(TemplateDef template, ArrayList<EObject> list) {
		val type = template.base.type

		if (type != null && type.ref != null && typeof(RecordDefNamed).isAssignableFrom(type.ref.class)) {
			list.addAll((type.ref as RecordDefNamed).body.defs)
		}
		if (type != null && type.ref != null && typeof(SignatureDef).isAssignableFrom(type.ref.class)) {
			list.addAll((type.ref as SignatureDef).paramList.params)
		}
	}

	def IScope scope_TimerRefOrAny_ref(TimerRefOrAny variable, EReference ref) {
		val list = newArrayList
		var parent = variable.eContainer
@@ -262,17 +225,6 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		scopeFor(inner)
	}

	def private void componentScopePorts(ComponentDef component, ArrayList<EObject> list) {
		for (ComponentDefList l : component.defs.filter[it.element.port != null]) {
			for (PortElement e : l.element.port.instances) {
				list.add(e)
			}
		}
		for (ComponentDef e : component.extends) {
			componentScopePorts(e, list)
		}
	}

	def IScope scope_SendStatement_port(SendStatement stm, EReference ref) {
		val list = newArrayList

@@ -297,4 +249,31 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		}
		scopeFor(list)
	}

	def IScope scope_ExtendedFieldReference_field(ExtendedFieldReference ext, EReference ref) {
		val value = ext.findDesiredParent(typeof(ReferencedValue)) as ReferencedValue
		val list = newArrayList
		val idx = value.fieldRefs.indexOf(ext)
		val type = value.ref

		if (idx == 0) {
			if (type instanceof SingleTempVarInstance) {
				val variable = type.findDesiredParent(typeof(VarInstance)) as VarInstance
				if (variable != null && variable.type.ref != null) {
					variable.type.ref.scopeReferencedFields(list)
				}
			}
		} else {
			val parent = value.fieldRefs.get(idx - 1)
			if (parent.field instanceof StructFieldDef) {
				if (parent.field.type != null) {
					parent.field.type.ref.scopeReferencedFields(list)
				}
			} else if (parent.field instanceof FormalValuePar) {
				// TODO: check and implement if required!
			}
		}
		scopeFor(list)
	}

}