Quellcode durchsuchen

Added test for property compatibility
(Bug Report SK)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6996 8c9fc860-2736-0410-a75d-ab315db34111

felixf vor 8 Jahren
Ursprung
Commit
5f1feac53d
2 geänderte Dateien mit 28 neuen und 9 gelöschten Zeilen
  1. 2 9
      source/FoxIntermediateBackend.Mod
  2. 26 0
      source/FoxSemanticChecker.Mod

+ 2 - 9
source/FoxIntermediateBackend.Mod

@@ -7190,15 +7190,8 @@ TYPE
 		BEGIN
 			WHILE modifier # NIL DO
 				symbol := cellType.FindProperty(modifier.identifier); 
-				(*
-				symbol := cellType.cellScope.FindSymbol(modifier.identifier);
-				*)
-				IF (symbol # NIL) & (symbol IS SyntaxTree.Property) THEN
-					AddProperty(cellType, cell, symbol(SyntaxTree.Property), modifier.expression);
-				ELSE
-					(*! move this check to checker *)
-					Error(modifier.position, "undefined property");
-				END;
+				ASSERT ((symbol # NIL) & (symbol IS SyntaxTree.Property));
+				AddProperty(cellType, cell, symbol(SyntaxTree.Property), modifier.expression);
 				modifier := modifier.nextModifier;
 			END;
 		END AddModifiers;

+ 26 - 0
source/FoxSemanticChecker.Mod

@@ -5073,6 +5073,29 @@ TYPE
 				END;
 				RETURN resultB
 			END CheckArity;
+			
+			PROCEDURE CheckModifiers(cellType: SyntaxTree.CellType; modifier: SyntaxTree.Modifier);
+			VAR propertyType, modifierType: SyntaxTree.Type; symbol: SyntaxTree.Symbol;
+			BEGIN
+				WHILE modifier # NIL DO
+					symbol := cellType.FindProperty(modifier.identifier); 
+					IF (symbol # NIL) & (symbol IS SyntaxTree.Property) THEN
+						propertyType := symbol.type.resolved; 
+						modifierType := modifier.expression.type.resolved;
+						IF ~CompatibleTo(system, modifierType, propertyType) &
+							~(
+								(modifierType IS SyntaxTree.ArrayType) & (propertyType IS SyntaxTree.ArrayType) & 
+								OpenArrayCompatible(modifierType(SyntaxTree.ArrayType), propertyType(SyntaxTree.ArrayType))) THEN
+							Error(modifier.position,Diagnostics.Invalid,"incompatible to cell property");
+						END;
+					ELSE
+						Error(modifier.position, Diagnostics.Invalid, "undefined property");
+					END;
+					modifier := modifier.nextModifier;
+				END;
+			END CheckModifiers;
+					
+
 
 		BEGIN
 			type := NIL; result := NIL;
@@ -5352,6 +5375,9 @@ TYPE
 
 								END;
 							END;
+
+							CheckModifiers(type0(SyntaxTree.CellType), parameter0(SyntaxTree.Designator).modifiers);
+
 							activeCellsStatement := TRUE;
 						ELSE
 							Error(position,Diagnostics.Invalid,"cannot be allocated");