Commit 7c209516 authored by Daniel Honsel's avatar Daniel Honsel
Browse files

some scope and validation stuff

parent 1a578afe
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -397,20 +397,17 @@ AltGuardChar:
	{AltGuardChar} SQUAREOPEN expr=BooleanExpression? SQUARECLOSE;

AltstepInstance:
	AltstepRef LPAREN list=FunctionActualParList? RPAREN;

AltstepRef:
	name=[AltstepDef|ExtendedIdentifier];
	ref=[AltstepDef|IDENTIFIER] LPAREN list=FunctionActualParList? RPAREN;

FunctionInstance:
	FunctionRef LPAREN params=FunctionActualParList? RPAREN;
	ref=[FunctionRef|IDENTIFIER] LPAREN params=FunctionActualParList? RPAREN;

	//TODO: check references
// scope fore something like this: foo.bar.func
// ext ref ok?
// usage / semantic of PreDefFunctionIdentifier?
FunctionRef:
	name=[FunctionDef|IDENTIFIER] | name=[ExtFunctionDef|IDENTIFIER];
	FunctionDef | ExtFunctionDef;
	//(IDENTIFIER DOT)? IDENTIFIER;

//PreDefFunctionIdentifier returns ecore::EString:
+48 −19
Original line number Diff line number Diff line
/*
 * generated by Xtext
 */
package de.ugoe.cs.swe.validation
//import org.eclipse.xtext.validation.Check
import org.eclipse.xtext.validation.Check
import de.ugoe.cs.swe.tTCN3.SingleConstDef
import de.ugoe.cs.swe.tTCN3.TTCN3Package
import org.eclipse.emf.ecore.EObject
import de.ugoe.cs.swe.tTCN3.ModuleDefinitionsList
import de.ugoe.cs.swe.tTCN3.ModuleDefinition
import de.ugoe.cs.swe.tTCN3.ConstDef
import de.ugoe.cs.swe.tTCN3.ConstList
import de.ugoe.cs.swe.tTCN3.TTCN3Module

/**
 * Custom validation rules. 
 *
 * see http://www.eclipse.org/Xtext/documentation.html#validation
 */
class TTCN3Validator extends AbstractTTCN3Validator {

//  public static val INVALID_NAME = 'invalidName'
//
//	@Check
//	def checkGreetingStartsWithCapital(Greeting greeting) {
//		if (!Character.isUpperCase(greeting.name.charAt(0))) {
//			warning('Name should start with a capital', 
//					MyDslPackage.Literals.GREETING__NAME,
//					INVALID_NAME)
//		}
//	}
	@Check
	def checkUniqueNameNestedVariable(SingleConstDef variable) {
		val container = variable.moduleDefList
		
		if (container == null) return;
		
		val defs = container.definitions.filter[it.def instanceof ConstDef]
		
		for (EObject v : defs) {
			val constDefList = ((v as ModuleDefinition).def as ConstDef).defs as ConstList
			
			for (SingleConstDef d : constDefList.list) {
				if (d != variable && d.name == variable.name) {
					// TODO: TTCN3Package$Literals::SINGLE_CONST_DEF__NAME
					error('Name clash with constant variable definition in parent module!', null, -1);
					return;
				}				
			}
		}
	}
	
	def private ModuleDefinitionsList getModuleDefList(EObject o) {
		if (o.eContainer == null)
			null
		else if (o.eContainer instanceof ModuleDefinitionsList)
			o.eContainer as ModuleDefinitionsList
		else
			o.eContainer.getModuleDefList
	}
	
	@Check
	def checkModuleStartsWithM(TTCN3Module module) {
		// TODO: module.name.toString.charAt(0) --> module.name.charAt(0)
		if (module.name.toString.charAt(0) != 'M') {
			//TODO: TTCN3Package$Literals::TTCN3_MODULE__NAME
			warning('Module names should start with M!', null, -1);
		}
	}	
	
}