Browse Source

* Patch from Mattias Gaertner
- assigned(array)
- open array: override, pass array literal, pass var
- reporting type mismatches shows full path if necessary
- fixed comparing basetype from different units
- types with unitname

git-svn-id: trunk@35681 -

michael 8 years ago
parent
commit
0653c7045e
2 changed files with 544 additions and 165 deletions
  1. 369 154
      packages/fcl-passrc/src/pasresolver.pp
  2. 175 11
      packages/fcl-passrc/tests/tcresolver.pas

File diff suppressed because it is too large
+ 369 - 154
packages/fcl-passrc/src/pasresolver.pp


+ 175 - 11
packages/fcl-passrc/tests/tcresolver.pas

@@ -162,12 +162,15 @@ type
     Procedure TestAlias2Type;
     Procedure TestAlias2Type;
     Procedure TestAliasTypeRefs;
     Procedure TestAliasTypeRefs;
     Procedure TestAliasOfVarFail;
     Procedure TestAliasOfVarFail;
+    Procedure TestAliasType_UnitPrefix;
+    Procedure TestAliasType_UnitPrefix_CycleFail;
     Procedure TestTypeAliasType; // ToDo
     Procedure TestTypeAliasType; // ToDo
 
 
     // var, const
     // var, const
     Procedure TestVarLongint;
     Procedure TestVarLongint;
     Procedure TestVarInteger;
     Procedure TestVarInteger;
     Procedure TestConstInteger;
     Procedure TestConstInteger;
+    Procedure TestConstInteger2;
     Procedure TestDuplicateVar;
     Procedure TestDuplicateVar;
     Procedure TestVarInitConst;
     Procedure TestVarInitConst;
     Procedure TestVarOfVarFail;
     Procedure TestVarOfVarFail;
@@ -196,6 +199,7 @@ type
     // enums
     // enums
     Procedure TestEnums;
     Procedure TestEnums;
     Procedure TestSets;
     Procedure TestSets;
+    Procedure TestSetConstRange;
     Procedure TestSetOperators;
     Procedure TestSetOperators;
     Procedure TestEnumParams;
     Procedure TestEnumParams;
     Procedure TestSetParams;
     Procedure TestSetParams;
@@ -230,6 +234,7 @@ type
     Procedure TestTypeCastBooleanToDoubleFail;
     Procedure TestTypeCastBooleanToDoubleFail;
     Procedure TestHighLow;
     Procedure TestHighLow;
     Procedure TestAssign_Access;
     Procedure TestAssign_Access;
+    Procedure TestAssignedIntFail;
 
 
     // statements
     // statements
     Procedure TestForLoop;
     Procedure TestForLoop;
@@ -268,6 +273,7 @@ type
     Procedure TestProcOverloadWithClassTypes;
     Procedure TestProcOverloadWithClassTypes;
     Procedure TestProcOverloadWithInhClassTypes;
     Procedure TestProcOverloadWithInhClassTypes;
     Procedure TestProcOverloadWithInhAliasClassTypes;
     Procedure TestProcOverloadWithInhAliasClassTypes;
+    Procedure TestProcOverloadBaseTypeOtherUnit;
     Procedure TestProcDuplicate;
     Procedure TestProcDuplicate;
     Procedure TestNestedProc;
     Procedure TestNestedProc;
     Procedure TestForwardProc;
     Procedure TestForwardProc;
@@ -281,6 +287,7 @@ type
     Procedure TestUnitIntfMismatchArgName;
     Procedure TestUnitIntfMismatchArgName;
     Procedure TestProcOverloadIsNotFunc;
     Procedure TestProcOverloadIsNotFunc;
     Procedure TestProcCallMissingParams;
     Procedure TestProcCallMissingParams;
+    Procedure TestProcArgDefaultValue;
     Procedure TestProcArgDefaultValueTypeMismatch;
     Procedure TestProcArgDefaultValueTypeMismatch;
     Procedure TestProcPassConstToVar;
     Procedure TestProcPassConstToVar;
     Procedure TestBuiltInProcCallMissingParams;
     Procedure TestBuiltInProcCallMissingParams;
@@ -311,7 +318,8 @@ type
     Procedure TestClass_Method;
     Procedure TestClass_Method;
     Procedure TestClass_MethodWithoutClassFail;
     Procedure TestClass_MethodWithoutClassFail;
     Procedure TestClass_MethodWithParams;
     Procedure TestClass_MethodWithParams;
-    Procedure TestClass_MethodUnresolved;
+    Procedure TestClass_MethodUnresolvedPrg;
+    Procedure TestClass_MethodUnresolvedUnit;
     Procedure TestClass_MethodAbstract;
     Procedure TestClass_MethodAbstract;
     Procedure TestClass_MethodAbstractWithoutVirtualFail;
     Procedure TestClass_MethodAbstractWithoutVirtualFail;
     Procedure TestClass_MethodAbstractHasBodyFail;
     Procedure TestClass_MethodAbstractHasBodyFail;
@@ -443,7 +451,8 @@ type
     Procedure TestStaticArray;
     Procedure TestStaticArray;
     Procedure TestArrayOfArray;
     Procedure TestArrayOfArray;
     Procedure TestFunctionReturningArray;
     Procedure TestFunctionReturningArray;
-    Procedure TestLowHighArray;
+    Procedure TestArray_LowHigh;
+    Procedure TestArray_Assigned;
     Procedure TestPropertyOfTypeArray;
     Procedure TestPropertyOfTypeArray;
     Procedure TestArrayElementFromFuncResult_AsParams;
     Procedure TestArrayElementFromFuncResult_AsParams;
     Procedure TestArrayEnumTypeRange;
     Procedure TestArrayEnumTypeRange;
@@ -457,6 +466,7 @@ type
     Procedure TestArray_PassArrayElementToVarParam;
     Procedure TestArray_PassArrayElementToVarParam;
     Procedure TestArray_OpenArrayOfString;
     Procedure TestArray_OpenArrayOfString;
     Procedure TestArray_OpenArrayOfString_IntFail;
     Procedure TestArray_OpenArrayOfString_IntFail;
+    Procedure TestArray_OpenArrayOverride;
 
 
     // procedure types
     // procedure types
     Procedure TestProcTypesAssignObjFPC;
     Procedure TestProcTypesAssignObjFPC;
@@ -476,6 +486,7 @@ type
     Procedure TestProcType_TNotifyEvent_NoAtFPC_Fail1;
     Procedure TestProcType_TNotifyEvent_NoAtFPC_Fail1;
     Procedure TestProcType_TNotifyEvent_NoAtFPC_Fail2;
     Procedure TestProcType_TNotifyEvent_NoAtFPC_Fail2;
     Procedure TestProcType_TNotifyEvent_NoAtFPC_Fail3;
     Procedure TestProcType_TNotifyEvent_NoAtFPC_Fail3;
+    Procedure TestProcType_WhileListCompare;
   end;
   end;
 
 
 function LinesToStr(Args: array of const): string;
 function LinesToStr(Args: array of const): string;
@@ -1736,6 +1747,30 @@ begin
   CheckParserException('Expected type, but got variable',PParser.nParserExpectedTypeButGot);
   CheckParserException('Expected type, but got variable',PParser.nParserExpectedTypeButGot);
 end;
 end;
 
 
+procedure TTestResolver.TestAliasType_UnitPrefix;
+begin
+  StartUnit(false);
+  Add('interface');
+  Add('type');
+  Add('  {#a}a=longint;');
+  Add('  {#b}{=a}b=afile.a;');
+  Add('var');
+  Add('  {=a}c: a;');
+  Add('  {=b}d: b;');
+  Add('implementation');
+  ParseUnit;
+end;
+
+procedure TTestResolver.TestAliasType_UnitPrefix_CycleFail;
+begin
+  StartUnit(false);
+  Add('interface');
+  Add('type');
+  Add('  {#a}a=afile.a;');
+  Add('implementation');
+  CheckResolverException('identifier not found "a"',nIdentifierNotFound);
+end;
+
 procedure TTestResolver.TestTypeAliasType;
 procedure TTestResolver.TestTypeAliasType;
 begin
 begin
   // ToDo
   // ToDo
@@ -1809,7 +1844,7 @@ var
 begin
 begin
   StartProgram(true);
   StartProgram(true);
   Add('const');
   Add('const');
-  Add('  c1:integer=3;'); // defined in system.pp
+  Add('  c1: integer=3;'); // defined in system.pp
   Add('begin');
   Add('begin');
   ParseProgram;
   ParseProgram;
   AssertEquals('1 declaration',1,PasProgram.ProgramSection.Declarations.Count);
   AssertEquals('1 declaration',1,PasProgram.ProgramSection.Declarations.Count);
@@ -1828,6 +1863,15 @@ begin
   AssertEquals('c1 expr value','3',ExprC1.Value);
   AssertEquals('c1 expr value','3',ExprC1.Value);
 end;
 end;
 
 
+procedure TTestResolver.TestConstInteger2;
+begin
+  StartProgram(false);
+  Add('const');
+  Add('  c1 = 3');
+  Add('  c2: longint=c1;'); // defined in system.pp
+  Add('begin');
+end;
+
 procedure TTestResolver.TestDuplicateVar;
 procedure TTestResolver.TestDuplicateVar;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
@@ -2163,6 +2207,16 @@ begin
   ParseProgram;
   ParseProgram;
 end;
 end;
 
 
+procedure TTestResolver.TestSetConstRange;
+begin
+  StartProgram(false);
+  Add('const');
+  Add('  MinInt = -1;');
+  Add('  MaxInt = +1;');
+  Add('  {#TMyInt}TMyInt = MinInt..MaxInt;');
+  Add('begin');
+end;
+
 procedure TTestResolver.TestSetOperators;
 procedure TTestResolver.TestSetOperators;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
@@ -2862,6 +2916,16 @@ begin
   CheckAccessMarkers;
   CheckAccessMarkers;
 end;
 end;
 
 
+procedure TTestResolver.TestAssignedIntFail;
+begin
+  StartProgram(false);
+  Add('var i: longint;');
+  Add('begin');
+  Add('  if Assigned(i) then ;');
+  CheckResolverException('Incompatible type arg no. 1: Got "Longint", expected "class or array"',
+    nIncompatibleTypeArgNo);
+end;
+
 procedure TTestResolver.TestForLoop;
 procedure TTestResolver.TestForLoop;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
@@ -3343,7 +3407,9 @@ end;
 procedure TTestResolver.TestProcParam;
 procedure TTestResolver.TestProcParam;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
-  Add('procedure Proc1(a: longint);');
+  Add('type');
+  Add('  integer = longint;');
+  Add('procedure Proc1(a: integer);');
   Add('begin');
   Add('begin');
   Add('  a:=3;');
   Add('  a:=3;');
   Add('end;');
   Add('end;');
@@ -3354,8 +3420,10 @@ end;
 procedure TTestResolver.TestProcParamAccess;
 procedure TTestResolver.TestProcParamAccess;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
-  Add('procedure DoIt(vI: longint; const vJ: longint; var vK: longint);');
-  Add('var vL: longint;');
+  Add('type');
+  Add('  integer = longint;');
+  Add('procedure DoIt(vI: integer; const vJ: integer; var vK: integer);');
+  Add('var vL: integer;');
   Add('begin');
   Add('begin');
   Add('  vi:=vi+1;');
   Add('  vi:=vi+1;');
   Add('  vl:=vj+1;');
   Add('  vl:=vj+1;');
@@ -3366,7 +3434,7 @@ begin
   Add('  DoIt(vk,vk,vk);');
   Add('  DoIt(vk,vk,vk);');
   Add('  DoIt(vl,vl,vl);');
   Add('  DoIt(vl,vl,vl);');
   Add('end;');
   Add('end;');
-  Add('var i: longint;');
+  Add('var i: integer;');
   Add('begin');
   Add('begin');
   Add('  DoIt(i,i,i);');
   Add('  DoIt(i,i,i);');
   ParseProgram;
   ParseProgram;
@@ -3495,6 +3563,29 @@ begin
   ParseProgram;
   ParseProgram;
 end;
 end;
 
 
+procedure TTestResolver.TestProcOverloadBaseTypeOtherUnit;
+begin
+  AddModuleWithIntfImplSrc('unit2.pp',
+    LinesToStr([
+    'procedure Val(var d: double);',
+    //'procedure Val(var i: integer);',
+    '']),
+    LinesToStr([
+    'procedure Val(var d: double); begin end;',
+    'procedure Val(var i: integer); begin end;',
+    '']));
+
+  StartProgram(true);
+  Add('uses unit2;');
+  Add('var');
+  Add('  d: double;');
+  Add('  i: integer;');
+  Add('begin');
+  //Add('  Val(i);');
+  Add('  Val(d);');
+  ParseProgram;
+end;
+
 procedure TTestResolver.TestProcDuplicate;
 procedure TTestResolver.TestProcDuplicate;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
@@ -3674,6 +3765,17 @@ begin
     PasResolver.nWrongNumberOfParametersForCallTo);
     PasResolver.nWrongNumberOfParametersForCallTo);
 end;
 end;
 
 
+procedure TTestResolver.TestProcArgDefaultValue;
+begin
+  StartProgram(false);
+  Add('const {#DefA}DefA = 3;');
+  Add('procedure Proc1(a: longint = {@DefA}DefA);');
+  Add('begin');
+  Add('end;');
+  Add('begin');
+  ParseProgram;
+end;
+
 procedure TTestResolver.TestProcArgDefaultValueTypeMismatch;
 procedure TTestResolver.TestProcArgDefaultValueTypeMismatch;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
@@ -4177,7 +4279,7 @@ begin
   ParseProgram;
   ParseProgram;
 end;
 end;
 
 
-procedure TTestResolver.TestClass_MethodUnresolved;
+procedure TTestResolver.TestClass_MethodUnresolvedPrg;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
   Add('type');
   Add('type');
@@ -4190,6 +4292,20 @@ begin
   CheckResolverException('forward proc not resolved',PasResolver.nForwardProcNotResolved);
   CheckResolverException('forward proc not resolved',PasResolver.nForwardProcNotResolved);
 end;
 end;
 
 
+procedure TTestResolver.TestClass_MethodUnresolvedUnit;
+begin
+  StartUnit(false);
+  Add('interface');
+  Add('type');
+  Add('  TObject = class');
+  Add('  end;');
+  Add('  TClassA = class');
+  Add('    procedure ProcA;');
+  Add('  end;');
+  Add('implementation');
+  CheckResolverException('forward proc not resolved',PasResolver.nForwardProcNotResolved);
+end;
+
 procedure TTestResolver.TestClass_MethodAbstract;
 procedure TTestResolver.TestClass_MethodAbstract;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
@@ -6214,7 +6330,8 @@ begin
   Add('    property B: longint read FB;');
   Add('    property B: longint read FB;');
   Add('  end;');
   Add('  end;');
   Add('begin');
   Add('begin');
-  CheckResolverException('Longint expected, but String found',PasResolver.nXExpectedButYFound);
+  CheckResolverException('Incompatible types: got "Longint" expected "String"',
+    PasResolver.nIncompatibleTypesGotExpected);
 end;
 end;
 
 
 procedure TTestResolver.TestPropertyReadAccessorProcNotFunc;
 procedure TTestResolver.TestPropertyReadAccessorProcNotFunc;
@@ -6280,7 +6397,8 @@ begin
   Add('    property B: longint write FB;');
   Add('    property B: longint write FB;');
   Add('  end;');
   Add('  end;');
   Add('begin');
   Add('begin');
-  CheckResolverException('Longint expected, but String found',PasResolver.nXExpectedButYFound);
+  CheckResolverException('Incompatible types: got "Longint" expected "String"',
+    PasResolver.nIncompatibleTypesGotExpected);
 end;
 end;
 
 
 procedure TTestResolver.TestPropertyWriteAccessorFuncNotProc;
 procedure TTestResolver.TestPropertyWriteAccessorFuncNotProc;
@@ -6851,7 +6969,7 @@ begin
   ParseProgram;
   ParseProgram;
 end;
 end;
 
 
-procedure TTestResolver.TestLowHighArray;
+procedure TTestResolver.TestArray_LowHigh;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
   Add('type');
   Add('type');
@@ -6866,6 +6984,15 @@ begin
   ParseProgram;
   ParseProgram;
 end;
 end;
 
 
+procedure TTestResolver.TestArray_Assigned;
+begin
+  StartProgram(false);
+  Add('var a: array of longint;');
+  Add('begin');
+  Add('  if Assigned(a) then ;');
+  ParseProgram;
+end;
+
 procedure TTestResolver.TestPropertyOfTypeArray;
 procedure TTestResolver.TestPropertyOfTypeArray;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
@@ -7101,6 +7228,28 @@ begin
   CheckResolverException('Incompatible types: got "Longint" expected "String"',nIncompatibleTypesGotExpected);
   CheckResolverException('Incompatible types: got "Longint" expected "String"',nIncompatibleTypesGotExpected);
 end;
 end;
 
 
+procedure TTestResolver.TestArray_OpenArrayOverride;
+begin
+  StartProgram(false);
+  Add('type');
+  Add('  TObject = class');
+  Add('  end;');
+  Add('  Exception = class');
+  Add('    constructor CreateFmt(const Msg: string; const Args: array of string); virtual;');
+  Add('  end;');
+  Add('  ESome = class(Exception)');
+  Add('    constructor CreateFmt(const Msg: string; const Args: array of string); override;');
+  Add('  end;');
+  Add('constructor Exception.CreateFmt(const Msg: string; const Args: array of string);');
+  Add('begin end;');
+  Add('constructor ESome.CreateFmt(const Msg: string; const Args: array of string);');
+  Add('begin');
+  Add('  inherited CreateFmt(Msg,Args);');
+  Add('end;');
+  Add('begin');
+  ParseProgram;
+end;
+
 procedure TTestResolver.TestProcTypesAssignObjFPC;
 procedure TTestResolver.TestProcTypesAssignObjFPC;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
@@ -7599,6 +7748,21 @@ begin
     nWrongNumberOfParametersForCallTo);
     nWrongNumberOfParametersForCallTo);
 end;
 end;
 
 
+procedure TTestResolver.TestProcType_WhileListCompare;
+begin
+  StartProgram(false);
+  Add('type');
+  Add('  integer = longint;');
+  Add('  TArrInt = array of Integer;');
+  Add('  TListCompare = function(Item1, Item2: Integer): integer;');
+  Add('procedure Sort(P: Integer; const List: TArrInt; const Compare: TListCompare);');
+  Add('begin');
+  Add('  while Compare(P,List[0])>0 do ;');
+  Add('end;');
+  Add('begin');
+  ParseProgram;
+end;
+
 initialization
 initialization
   RegisterTests([TTestResolver]);
   RegisterTests([TTestResolver]);
 
 

Some files were not shown because too many files changed in this diff