Browse Source

fcl-passrc: resolver: use same msg id as fpc for some hints

git-svn-id: trunk@38980 -
Mattias Gaertner 7 years ago
parent
commit
a445450486

+ 22 - 10
packages/fcl-passrc/src/pasresolveeval.pas

@@ -91,7 +91,7 @@ const
   nCallingConventionMismatch = 3018;
   nResultTypeMismatchExpectedButFound = 3019;
   nFunctionHeaderMismatchForwardVarName = 3020;
-  nFunctionHidesIdentifier = 3021;
+  nFunctionHidesIdentifier_NonVirtualMethod = 3021;
   nNoMethodInAncestorToOverride = 3022;
   nInheritedOnlyWorksInMethods = 3023;
   nInheritedNeedsAncestor = 3024;
@@ -120,7 +120,7 @@ const
   nExpectXArrayElementsButFoundY = 3047;
   nCannotCreateADescendantOfTheSealedXY = 3048;
   nAncestorIsNotExternal = 3049;
-  nVirtualMethodXHasLowerVisibility = 3050; // FPC 3250
+  // free 3050
   nExternalClassInstanceCannotAccessStaticX = 3051;
   nXModifierMismatchY = 3052;
   nSymbolCannotBePublished = 3053;
@@ -128,12 +128,12 @@ const
   nTypeIdentifierExpected = 3055;
   nCannotNestAnonymousX = 3056;
   nFoundCallCandidateX = 3057;
-  nSymbolXIsNotPortable = 3058;
-  nSymbolXIsExperimental = 3059;
-  nSymbolXIsNotImplemented = 3060;
-  nSymbolXBelongsToALibrary = 3061;
-  nSymbolXIsDeprecated = 3062;
-  nSymbolXIsDeprecatedY = 3063;
+  // free 3058
+  // free 3059
+  // free 3060
+  // free 3061
+  // free 3062
+  // free 3063
   nRangeCheckError = 3064;
   nHighRangeLimitLTLowRangeLimit = 3065;
   nRangeCheckEvaluatingConstantsVMinMax = 3066;
@@ -150,7 +150,7 @@ const
   nMethodHidesMethodOfBaseType = 3077;
   nContextExpectedXButFoundY = 3078;
   nContextXInvalidY = 3079;
-  nConstructingClassXWithAbstractMethodY = 3080;
+  // free 3080;
   nXIsNotSupported = 3081;
   nOperatorIsNotOverloadedAOpB = 3082;
   nIllegalQualifierAfter = 3084;
@@ -171,6 +171,17 @@ const
   nMissingFieldsX = 3109;
   nCantAssignValuesToConstVariable = 3110;
   nIllegalAssignmentToForLoopVar = 3111;
+  nFunctionHidesIdentifier_NonProc = 3112;
+
+  // using same IDs as FPC
+  nVirtualMethodXHasLowerVisibility = 3250;
+  nConstructingClassXWithAbstractMethodY = 4046;
+  nSymbolXIsDeprecated = 5043;
+  nSymbolXBelongsToALibrary = 5065;
+  nSymbolXIsDeprecatedY = 5066;
+  nSymbolXIsNotPortable = 5076;
+  nSymbolXIsNotImplemented = 5078;
+  nSymbolXIsExperimental = 5079;
 
 // resourcestring patterns of messages
 resourcestring
@@ -194,7 +205,7 @@ resourcestring
   sCallingConventionMismatch = 'Calling convention mismatch';
   sResultTypeMismatchExpectedButFound = 'Result type mismatch, expected %s, but found %s';
   sFunctionHeaderMismatchForwardVarName = 'function header "%s" doesn''t match forward : var name changes %s => %s';
-  sFunctionHidesIdentifier = 'function hides identifier at "%s"';
+  sFunctionHidesIdentifier = 'function hides identifier at "%s". Use overload or reintroduce';
   sNoMethodInAncestorToOverride = 'There is no method in an ancestor class to be overridden "%s"';
   sInheritedOnlyWorksInMethods = 'Inherited works only in methods';
   sInheritedNeedsAncestor = 'inherited needs an ancestor';
@@ -274,6 +285,7 @@ resourcestring
   sMissingFieldsX = 'Missing fields: "%s"';
   sCantAssignValuesToConstVariable = 'Can''t assign values to const variable';
   sIllegalAssignmentToForLoopVar = 'Illegal assignment to for-loop variable "%s"';
+  // sFunctionHidesIdentifier_NonProc = sFunctionHidesIdentifier
 
 type
   { TResolveData - base class for data stored in TPasElement.CustomData }

+ 4 - 3
packages/fcl-passrc/src/pasresolver.pp

@@ -4030,7 +4030,7 @@ begin
             [El.Name,GetElementSourcePosStr(El)],Data^.Proc.ProcType)
         else
           // give a hint
-          LogMsg(20171118205344,mtHint,nFunctionHidesIdentifier,sFunctionHidesIdentifier,
+          LogMsg(20171118205344,mtHint,nFunctionHidesIdentifier_NonProc,sFunctionHidesIdentifier,
             [GetElementSourcePosStr(El)],Data^.Proc.ProcType);
       fopkMethod:
         // method hides a non proc
@@ -4125,8 +4125,9 @@ begin
               [Data^.Proc.Name,Proc.Parent.Name,GetElementSourcePosStr(Proc)],Data^.Proc.ProcType)
           else
             // Delphi/FPC do not give a message when hiding a non virtual method
-            // -> emit only an Info
-            LogMsg(20171118214523,mtInfo,nFunctionHidesIdentifier,sFunctionHidesIdentifier,
+            // -> emit Hint with other message id
+            LogMsg(20171118214523,mtHint,
+              nFunctionHidesIdentifier_NonVirtualMethod,sFunctionHidesIdentifier,
               [GetElementSourcePosStr(Proc)],Data^.Proc.ProcType);
           Abort:=true;
           end;

+ 1 - 0
packages/fcl-passrc/src/pasuseanalyzer.pas

@@ -48,6 +48,7 @@ uses
   PasTree, PScanner, PasResolveEval, PasResolver;
 
 const
+  // use same IDs as fpc
   nPAUnitNotUsed = 5023;
   sPAUnitNotUsed = 'Unit "%s" not used in %s';
   nPAParameterNotUsed = 5024;

+ 18 - 2
packages/fcl-passrc/tests/tcresolver.pas

@@ -643,6 +643,7 @@ type
     Procedure TestClassInterface_MethodVirtualFail;
     Procedure TestClassInterface_Overloads;
     Procedure TestClassInterface_OverloadHint;
+    Procedure TestClassInterface_OverloadNoHint;
     Procedure TestClassInterface_IntfListClassFail;
     Procedure TestClassInterface_IntfListDuplicateFail;
     Procedure TestClassInterface_MissingMethodFail;
@@ -7733,7 +7734,8 @@ begin
   'begin',
   '  b.DoIt(3);']);
   ParseProgram;
-  CheckResolverHint(mtInfo,nFunctionHidesIdentifier,'function hides identifier at "afile.pp(4,19)"');
+  CheckResolverHint(mtHint,nFunctionHidesIdentifier_NonVirtualMethod,
+   'function hides identifier at "afile.pp(4,19)". Use overload or reintroduce');
 end;
 
 procedure TTestResolver.TestClass_MethodReintroduce;
@@ -10875,7 +10877,21 @@ begin
   '  end;',
   'begin']);
   ParseProgram;
-  CheckResolverHint(mtInfo,nFunctionHidesIdentifier,'function hides identifier at "afile.pp(4,19)"');
+  CheckResolverHint(mtHint,nFunctionHidesIdentifier_NonVirtualMethod,'function hides identifier at "afile.pp(4,19)". Use overload or reintroduce');
+end;
+
+procedure TTestResolver.TestClassInterface_OverloadNoHint;
+begin
+  StartProgram(false);
+  Add([
+  'type',
+  '  IUnknown = interface',
+  '    procedure DoIt;',
+  '    procedure DoIt(i: longint);',
+  '  end;',
+  'begin']);
+  ParseProgram;
+  CheckResolverUnexpectedHints;
 end;
 
 procedure TTestResolver.TestClassInterface_IntfListClassFail;