Commit 22d62fc6 authored by Daniel Honsel's avatar Daniel Honsel
Browse files

fixed checkNoDuplicatedModuleDefinitionIdentifiers

parent f6924163
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -678,6 +678,7 @@ SubTypeDef:
SubTypeDefNamed:
	type=Type name=IDENTIFIER array=ArrayDef? spec=SubTypeSpec?;

// TODO: generate inheritance for named types!
StructuredTypeDef:
	record=RecordDef | union=UnionDef | set=SetDef | recordOf=RecordOfDef | setOf=SetOfDef | enumDef=EnumDef |
	port=PortDef | component=ComponentDef;
+67 −17
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ import static extension de.ugoe.cs.swe.common.TTCN3ScopeHelper.*
import static extension org.eclipse.xtext.EcoreUtil2.*
import de.ugoe.cs.swe.tTCN3.PortElement
import de.ugoe.cs.swe.tTCN3.ExtFunctionDef
import java.util.HashMap

class CheckDefinitionComeFirstParameter {
	public boolean hasOtherDefinitions
@@ -88,7 +89,7 @@ class CheckDefinitionComeFirstParameter {
}

class CodeStyleValidator extends AbstractDeclarativeValidator {
	val static Map<String, ArrayList<String>> moduleLevelIdentifiersMap = new ConcurrentHashMap<String, ArrayList<String>>();
	val static Map<String, HashMap<String, List<TTCN3Reference>>> moduleLevelIdentifiersMap = new ConcurrentHashMap<String, HashMap<String, List<TTCN3Reference>>>();
	val ConfigTools configTools = ConfigTools.getInstance;
	var QualityCheckProfile activeProfile = configTools.selectedProfile as QualityCheckProfile
	final TTCN3StatisticsProvider statistics = TTCN3StatisticsProvider.getInstance
@@ -565,7 +566,7 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
			return;

		val parentModule = definition.findDesiredParent(TTCN3Module)
		var ArrayList<String> identifiers = newArrayList
		var HashMap<String, List<TTCN3Reference>> identifiers = newHashMap
		var idExists = false
		var TTCN3Reference detailDef = null

@@ -578,47 +579,94 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
		if (definition.def instanceof ConstDef) {
			val constDefList = (definition.def as ConstDef).defs as ConstList
			for (SingleConstDef d : constDefList.list) {
				idExists = d.name.checkIdentifier(identifiers)
				detailDef = d
				idExists = d.name.checkIdentifier(detailDef, identifiers)
			}
		} else if (definition.def instanceof ModuleParDef) {
			if ((definition.def as ModuleParDef).param != null) {
				for (ModuleParameter p : (definition.def as ModuleParDef).param.list.params) {
					idExists = p.name.checkIdentifier(identifiers)
					detailDef = p
					idExists = p.name.checkIdentifier(detailDef, identifiers)
				}
			} else if ((definition.def as ModuleParDef).multitypeParam != null) {
				for (ModulePar p : (definition.def as ModuleParDef).multitypeParam.params) {
					for (ModuleParameter pa : p.list.params) {
						idExists = pa.name.checkIdentifier(identifiers)
						detailDef = pa
						idExists = pa.name.checkIdentifier(detailDef, identifiers)
					}
				}
			}
		} else if (definition.def instanceof FunctionDef) {
			idExists = (definition.def as FunctionDef).name.checkIdentifier(identifiers)
			detailDef = definition.def as FunctionDef
			idExists = (definition.def as FunctionDef).name.checkIdentifier(detailDef, identifiers)
		} else if (definition.def instanceof TemplateDef) {
			idExists = (definition.def as TemplateDef).base.name.checkIdentifier(identifiers)
			detailDef = (definition.def as TemplateDef).base
			idExists = (definition.def as TemplateDef).base.name.checkIdentifier(detailDef, identifiers)
		} else if (definition.def instanceof SignatureDef) {
			idExists = (definition.def as SignatureDef).name.checkIdentifier(identifiers)
			detailDef = definition.def as SignatureDef
			idExists = (definition.def as SignatureDef).name.checkIdentifier(detailDef, identifiers)
		} else if (definition.def instanceof TestcaseDef) {
			idExists = (definition.def as TestcaseDef).name.checkIdentifier(identifiers)
			detailDef = definition.def as TestcaseDef
			idExists = (definition.def as TestcaseDef).name.checkIdentifier(detailDef, identifiers)
		} else if (definition.def instanceof AltstepDef) {
			idExists = (definition.def as AltstepDef).name.checkIdentifier(identifiers)
			detailDef = definition.def as AltstepDef
			idExists = (definition.def as AltstepDef).name.checkIdentifier(detailDef, identifiers)
		} else if (definition.def instanceof GroupDef) {
			idExists = (definition.def as GroupDef).name.checkIdentifier(identifiers)
			detailDef = definition.def as GroupDef
			idExists = (definition.def as GroupDef).name.checkIdentifier(detailDef, identifiers)
		} else if (definition.def instanceof TypeDef) {
			val typeDef = definition.def as TypeDef
			if (typeDef.body.structured != null) {
				val struct = typeDef.body.structured
				if (struct.record != null && struct.record instanceof RecordDefNamed) {
					detailDef = struct.record as TTCN3Reference
					idExists = (struct.record as TTCN3Reference).name.checkIdentifier(detailDef, identifiers)
				} else if (struct.union != null && struct.union instanceof UnionDefNamed) {
					detailDef = struct.union as TTCN3Reference
					idExists = (struct.union as TTCN3Reference).name.checkIdentifier(detailDef, identifiers)
				} else if (struct.set != null && struct.set instanceof SetDefNamed) {
					detailDef = struct.set as TTCN3Reference
					idExists = (struct.set as TTCN3Reference).name.checkIdentifier(detailDef, identifiers)
				} else if (struct.recordOf != null && struct.recordOf instanceof RecordOfDefNamed) {
					detailDef = struct.recordOf as TTCN3Reference
					idExists = (struct.recordOf as TTCN3Reference).name.checkIdentifier(detailDef, identifiers)
				} else if (struct.setOf != null && struct.setOf instanceof SetOfDefNamed) {
					detailDef = struct.setOf as TTCN3Reference
					idExists = (struct.setOf as TTCN3Reference).name.checkIdentifier(detailDef, identifiers)
				} else if (struct.enumDef != null && struct.enumDef instanceof EnumDefNamed) {
					detailDef = struct.enumDef as TTCN3Reference
					idExists = (struct.enumDef as TTCN3Reference).name.checkIdentifier(detailDef, identifiers)
				} else if (struct.port != null) {
					detailDef = struct.port as TTCN3Reference
					idExists = (struct.port as TTCN3Reference).name.checkIdentifier(detailDef, identifiers)
				} else if (struct.component != null) {
					detailDef = struct.component as TTCN3Reference
					idExists = (struct.component as TTCN3Reference).name.checkIdentifier(detailDef, identifiers)
				}
			} else if (typeDef.body.sub != null) {
				if (typeDef.body.sub instanceof SubTypeDefNamed) {
					detailDef = typeDef.body.sub as TTCN3Reference
					idExists = (typeDef.body.sub as TTCN3Reference).name.checkIdentifier(detailDef, identifiers)
				}
			}
		}
		
		if (idExists) {
			statistics.incrementCountStyle
			val message = "Identifier \"" + detailDef.name + "\" on the module level has already been used in " +
				parentModule.name + "!"
			var message = "Identifier \"" + detailDef.name + "\" on the module level has already been used in "
				val size = identifiers.get(detailDef.name).size - 1
				var i = 0;
				for (d : identifiers.get(detailDef.name)) {
					if (d != detailDef) {
						val INode node = NodeModelUtils.getNode(d)
						message += "<\"" + parentModule.name + ": " + node.startLine.toString + "\">"
						if (size > 1 && i < size - 1) {
							message += ", "
						}
						i++
					}
				} 
			message +=  "!"
			val INode node = NodeModelUtils.getNode(detailDef)
			warning(
				message,
@@ -631,12 +679,14 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
		}
	}

	private def boolean checkIdentifier(String name, ArrayList<String> ids) {
	private def boolean checkIdentifier(String name, TTCN3Reference definition, HashMap<String, List<TTCN3Reference>> ids) {
		var res = false
		if (ids.contains(name)) {
		if (ids.containsKey(name)) {
			ids.get(name).add(definition)
			res = true
		} else {
			ids.add(name)
			val list = newArrayList(definition)
			ids.put(name, list)
		}
		res
	}