mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 06:59:48 +01:00 
			
		
		
		
	codetools: TFindDeclarationTool.CheckParameterSyntax: check comments
git-svn-id: trunk@39956 -
This commit is contained in:
		
							parent
							
								
									84b225d357
								
							
						
					
					
						commit
						e9f840669c
					
				@ -2114,7 +2114,7 @@ begin
 | 
			
		||||
  DebugLn('  CompleteLocalIdentifierByParameter: B check if it is a parameter ...');
 | 
			
		||||
  {$ENDIF}
 | 
			
		||||
  // check parameter syntax
 | 
			
		||||
  if not CheckParameterSyntax(CursorNode,CleanCursorPos,
 | 
			
		||||
  if not CheckParameterSyntax(CursorNode.StartPos,CleanCursorPos,
 | 
			
		||||
                              VarNameRange,ProcNameAtom,ParameterIndex)
 | 
			
		||||
  then
 | 
			
		||||
    exit;
 | 
			
		||||
 | 
			
		||||
@ -66,6 +66,7 @@ interface
 | 
			
		||||
{ $DEFINE ShowProcSearch}
 | 
			
		||||
{ $DEFINE VerboseFindDeclarationFail}
 | 
			
		||||
{ $DEFINE DebugAddToolDependency}
 | 
			
		||||
{ $DEFINE VerboseCPS}
 | 
			
		||||
 | 
			
		||||
{$IFDEF CTDEBUG}{$DEFINE DebugPrefix}{$ENDIF}
 | 
			
		||||
{$IFDEF ShowTriedIdentifiers}{$DEFINE DebugPrefix}{$ENDIF}
 | 
			
		||||
@ -723,8 +724,8 @@ type
 | 
			
		||||
      Params: TFindDeclarationParams): TTypeCompatibility;
 | 
			
		||||
    function IsBaseCompatible(const TargetType, ExpressionType: TExpressionType;
 | 
			
		||||
      Params: TFindDeclarationParams): TTypeCompatibility;
 | 
			
		||||
    function CheckParameterSyntax(CursorNode: TCodeTreeNode;
 | 
			
		||||
      CleanCursorPos: integer; out ParameterAtom, ProcNameAtom: TAtomPosition;
 | 
			
		||||
    function CheckParameterSyntax(StartPos, CleanCursorPos: integer;
 | 
			
		||||
      out ParameterAtom, ProcNameAtom: TAtomPosition;
 | 
			
		||||
      out ParameterIndex: integer): boolean;
 | 
			
		||||
  protected
 | 
			
		||||
    function CheckDirectoryCache: boolean;
 | 
			
		||||
@ -9180,7 +9181,7 @@ begin
 | 
			
		||||
  {$ENDIF}
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TFindDeclarationTool.CheckParameterSyntax(CursorNode: TCodeTreeNode;
 | 
			
		||||
function TFindDeclarationTool.CheckParameterSyntax(StartPos,
 | 
			
		||||
  CleanCursorPos: integer; out ParameterAtom, ProcNameAtom: TAtomPosition; out
 | 
			
		||||
  ParameterIndex: integer): boolean;
 | 
			
		||||
// check for Identifier(expr,expr,...,expr,VarName
 | 
			
		||||
@ -9328,21 +9329,30 @@ function TFindDeclarationTool.CheckParameterSyntax(CursorNode: TCodeTreeNode;
 | 
			
		||||
    end;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
var
 | 
			
		||||
  CommentStart: integer;
 | 
			
		||||
  CommentEnd: integer;
 | 
			
		||||
begin
 | 
			
		||||
  {$IFDEF CheckNodeTool}CheckNodeTool(CursorNode);{$ENDIF}
 | 
			
		||||
  Result:=false;
 | 
			
		||||
  ParameterAtom:=CleanAtomPosition;
 | 
			
		||||
  ProcNameAtom:=CleanAtomPosition;
 | 
			
		||||
  ParameterIndex:=0;
 | 
			
		||||
  //DebugLn('TFindDeclarationTool.CheckParameterSyntax START');
 | 
			
		||||
 | 
			
		||||
  if StartPos<1 then exit;
 | 
			
		||||
  // read code in front to find ProcName and check the syntax
 | 
			
		||||
  MoveCursorToNodeStart(CursorNode);
 | 
			
		||||
  MoveCursorToCleanPos(StartPos);
 | 
			
		||||
  repeat
 | 
			
		||||
    ReadNextAtom;
 | 
			
		||||
    {$IFDEF VerboseCPS}DebugLn('TCodeCompletionCodeTool.CheckParameterSyntax ',GetAtom,' ',dbgs(CurPos.EndPos),'<',dbgs(CleanCursorPos));{$ENDIF}
 | 
			
		||||
    if CurPos.EndPos>CleanCursorPos then exit;
 | 
			
		||||
    if (CurPos.Flag in [cafRoundBracketOpen,cafEdgedBracketOpen])
 | 
			
		||||
    {$IFDEF VerboseCPS}DebugLn('TFindDeclarationTool.CheckParameterSyntax ',GetAtom,' at ',CleanPosToStr(CurPos.StartPos),' ',dbgs(CurPos.EndPos),'<',dbgs(CleanCursorPos));{$ENDIF}
 | 
			
		||||
    if CurPos.EndPos>CleanCursorPos then begin
 | 
			
		||||
      if LastAtoms.Count=0 then exit;
 | 
			
		||||
      if not CleanPosIsInComment(CleanCursorPos,LastAtoms.GetValueAt(0).EndPos,
 | 
			
		||||
        CommentStart,CommentEnd,false) then exit;
 | 
			
		||||
      // cursor in a comment
 | 
			
		||||
      // => parse within the comment
 | 
			
		||||
      MoveCursorToCleanPos(CommentStart);
 | 
			
		||||
    end else if (CurPos.Flag in [cafRoundBracketOpen,cafEdgedBracketOpen])
 | 
			
		||||
    and (LastAtoms.GetValueAt(0).Flag=cafWord) then begin
 | 
			
		||||
      UndoReadNextAtom;
 | 
			
		||||
      if CheckIdentifierAndParameterList then exit(true);
 | 
			
		||||
 | 
			
		||||
@ -2673,11 +2673,11 @@ var
 | 
			
		||||
      exit;
 | 
			
		||||
    end;
 | 
			
		||||
    // check if cursor is in a parameter list
 | 
			
		||||
    if not CheckParameterSyntax(CursorNode, CleanCursorPos,
 | 
			
		||||
    if not CheckParameterSyntax(CursorNode.StartPos, CleanCursorPos,
 | 
			
		||||
                                VarNameAtom, ProcNameAtom, ParameterIndex)
 | 
			
		||||
    then begin
 | 
			
		||||
      if VarNameAtom.StartPos=0 then ;
 | 
			
		||||
      //DebugLn(['TIdentCompletionTool.FindCodeContext.CheckContextIsParameter not in a parameter list']);
 | 
			
		||||
      DebugLn(['TIdentCompletionTool.FindCodeContext.CheckContextIsParameter not in a parameter list']);
 | 
			
		||||
      exit;
 | 
			
		||||
    end;
 | 
			
		||||
    //DebugLn('CheckContextIsParameter Variable=',GetAtom(VarNameAtom),' Proc=',GetAtom(ProcNameAtom),' ParameterIndex=',dbgs(ParameterIndex));
 | 
			
		||||
 | 
			
		||||
@ -60,7 +60,8 @@ type
 | 
			
		||||
  public
 | 
			
		||||
    // comments
 | 
			
		||||
    function CleanPosIsInComment(CleanPos, CleanCodePosInFront: integer;
 | 
			
		||||
        var CommentStart, CommentEnd: integer): boolean;
 | 
			
		||||
        var CommentStart, CommentEnd: integer;
 | 
			
		||||
        OuterCommentBounds: boolean = true): boolean;
 | 
			
		||||
 | 
			
		||||
    // general extraction
 | 
			
		||||
    function ExtractNode(ANode: TCodeTreeNode;
 | 
			
		||||
@ -255,9 +256,11 @@ begin
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TPascalReaderTool.CleanPosIsInComment(CleanPos,
 | 
			
		||||
  CleanCodePosInFront: integer; var CommentStart, CommentEnd: integer
 | 
			
		||||
  ): boolean;
 | 
			
		||||
  CleanCodePosInFront: integer; var CommentStart, CommentEnd: integer;
 | 
			
		||||
  OuterCommentBounds: boolean): boolean;
 | 
			
		||||
var CommentLvl, CurCommentPos: integer;
 | 
			
		||||
  CurEnd: Integer;
 | 
			
		||||
  CurCommentInnerEnd: Integer;
 | 
			
		||||
begin
 | 
			
		||||
  Result:=false;
 | 
			
		||||
  if CleanPos>SrcLen then exit;
 | 
			
		||||
@ -270,23 +273,29 @@ begin
 | 
			
		||||
    if CurPos.StartPos>CleanPos then begin
 | 
			
		||||
      //DebugLn(['TPascalReaderTool.CleanPosIsInComment ',GetATom,' StartPos=',CurPos.StartPos,' CleanPos=',CleanPos]);
 | 
			
		||||
      // CleanPos between two atoms -> parse space between for comments
 | 
			
		||||
      CommentStart:=CleanCodePosInFront;
 | 
			
		||||
      CommentEnd:=CurPos.StartPos;
 | 
			
		||||
      if CommentEnd>SrcLen then CommentEnd:=SrcLen+1;
 | 
			
		||||
      while CommentStart<CommentEnd do begin
 | 
			
		||||
      if LastAtoms.Count>0 then
 | 
			
		||||
        CommentStart:=LastAtoms.GetValueAt(0).EndPos
 | 
			
		||||
      else
 | 
			
		||||
        CommentStart:=CleanCodePosInFront;
 | 
			
		||||
      CurEnd:=CurPos.StartPos;
 | 
			
		||||
      if CurEnd>SrcLen then CurEnd:=SrcLen+1;
 | 
			
		||||
      while CommentStart<CurEnd do begin
 | 
			
		||||
        if IsCommentStartChar[Src[CommentStart]] then begin
 | 
			
		||||
          CurCommentPos:=CommentStart;
 | 
			
		||||
          case Src[CurCommentPos] of
 | 
			
		||||
          CurCommentInnerEnd:=CurEnd;
 | 
			
		||||
          case Src[CommentStart] of
 | 
			
		||||
          '{':
 | 
			
		||||
            begin
 | 
			
		||||
              inc(CurCommentPos);
 | 
			
		||||
              if (CurCommentPos<CommentEnd) and (Src[CurCommentPos]=#3) then begin
 | 
			
		||||
              if (CurCommentPos<=SrcLen) and (Src[CurCommentPos]=#3) then begin
 | 
			
		||||
                // codetools skip comment
 | 
			
		||||
                inc(CurCommentPos);
 | 
			
		||||
                while (CurCommentPos<CommentEnd) do begin
 | 
			
		||||
                if not OuterCommentBounds then CommentStart:=CurCommentPos;
 | 
			
		||||
                while (CurCommentPos<CurEnd) do begin
 | 
			
		||||
                  if (Src[CurCommentPos]=#3)
 | 
			
		||||
                  and (CurCommentPos+1<CommentEnd) and (Src[CurCommentPos+1]='}')
 | 
			
		||||
                  and (CurCommentPos+1<CurEnd) and (Src[CurCommentPos+1]='}')
 | 
			
		||||
                  then begin
 | 
			
		||||
                    CurCommentInnerEnd:=CurCommentPos;
 | 
			
		||||
                    inc(CurCommentPos,2);
 | 
			
		||||
                    break;
 | 
			
		||||
                  end;
 | 
			
		||||
@ -294,48 +303,67 @@ begin
 | 
			
		||||
                end;
 | 
			
		||||
              end else begin
 | 
			
		||||
                // pascal comment
 | 
			
		||||
                if not OuterCommentBounds then CommentStart:=CurCommentPos;
 | 
			
		||||
                CommentLvl:=1;
 | 
			
		||||
                while (CurCommentPos<CommentEnd) and (CommentLvl>0) do begin
 | 
			
		||||
                while (CurCommentPos<CurEnd) do begin
 | 
			
		||||
                  case Src[CurCommentPos] of
 | 
			
		||||
                  '{': if Scanner.NestedComments then inc(CommentLvl);
 | 
			
		||||
                  '}': dec(CommentLvl);
 | 
			
		||||
                  '}':
 | 
			
		||||
                    begin
 | 
			
		||||
                      dec(CommentLvl);
 | 
			
		||||
                      if (CommentLvl=0) then begin
 | 
			
		||||
                        CurCommentInnerEnd:=CurCommentPos;
 | 
			
		||||
                        inc(CurCommentPos);
 | 
			
		||||
                        break;
 | 
			
		||||
                      end;
 | 
			
		||||
                    end;
 | 
			
		||||
                  end;
 | 
			
		||||
                  inc(CurCommentPos);
 | 
			
		||||
                end;
 | 
			
		||||
              end;
 | 
			
		||||
            end;
 | 
			
		||||
          '/':  // Delphi comment
 | 
			
		||||
            if (CurCommentPos<CommentEnd-1) and (Src[CurCommentPos+1]='/') then
 | 
			
		||||
            if (CurCommentPos<SrcLen) and (Src[CurCommentPos+1]='/') then
 | 
			
		||||
            begin
 | 
			
		||||
              inc(CurCommentPos,2);
 | 
			
		||||
              while (CurCommentPos<CommentEnd)
 | 
			
		||||
              if not OuterCommentBounds then CommentStart:=CurCommentPos;
 | 
			
		||||
              while (CurCommentPos<CurEnd)
 | 
			
		||||
              and (not (Src[CurCommentPos] in [#10,#13])) do
 | 
			
		||||
                inc(CurCommentPos);
 | 
			
		||||
              CurCommentInnerEnd:=CurCommentPos;
 | 
			
		||||
              inc(CurCommentPos);
 | 
			
		||||
              if (CurCommentPos<CommentEnd)
 | 
			
		||||
              if (CurCommentPos<CurEnd)
 | 
			
		||||
              and (Src[CurCommentPos] in [#10,#13])
 | 
			
		||||
              and (Src[CurCommentPos-1]<>Src[CurCommentPos]) then
 | 
			
		||||
                inc(CurCommentPos);
 | 
			
		||||
            end else
 | 
			
		||||
              break;
 | 
			
		||||
          '(': // old turbo pascal comment
 | 
			
		||||
            if (CurCommentPos<CommentEnd-1) and (Src[CurCommentPos+1]='*') then
 | 
			
		||||
          '(': // Turbo pascal comment
 | 
			
		||||
            if (CurCommentPos<SrcLen) and (Src[CurCommentPos+1]='*') then
 | 
			
		||||
            begin
 | 
			
		||||
              inc(CurCommentPos,3);
 | 
			
		||||
              while (CurCommentPos<CommentEnd)
 | 
			
		||||
              and ((Src[CurCommentPos-1]<>'*') or (Src[CurCommentPos]<>')'))
 | 
			
		||||
              do
 | 
			
		||||
              inc(CurCommentPos,2);
 | 
			
		||||
              if not OuterCommentBounds then CommentStart:=CurCommentPos;
 | 
			
		||||
              while (CurCommentPos<CurEnd) do begin
 | 
			
		||||
                if (Src[CurCommentPos]='*') and (CurCommentPos+1<CurEnd)
 | 
			
		||||
                and (Src[CurCommentPos+1]=')') then
 | 
			
		||||
                begin
 | 
			
		||||
                  CurCommentInnerEnd:=CurCommentPos;
 | 
			
		||||
                  inc(CurCommentPos,2);
 | 
			
		||||
                  break;
 | 
			
		||||
                end;
 | 
			
		||||
                inc(CurCommentPos);
 | 
			
		||||
              inc(CurCommentPos);
 | 
			
		||||
              end;
 | 
			
		||||
            end else
 | 
			
		||||
              break;
 | 
			
		||||
          end;
 | 
			
		||||
          if (CurCommentPos>CommentStart) and (CleanPos<CurCommentPos) then
 | 
			
		||||
          begin
 | 
			
		||||
            // CleanPos in comment
 | 
			
		||||
            CommentEnd:=CurCommentPos;
 | 
			
		||||
            Result:=true;
 | 
			
		||||
            exit;
 | 
			
		||||
            if OuterCommentBounds then
 | 
			
		||||
              CommentEnd:=CurCommentPos
 | 
			
		||||
            else
 | 
			
		||||
              CommentEnd:=CurCommentInnerEnd;
 | 
			
		||||
            exit(true);
 | 
			
		||||
          end;
 | 
			
		||||
          CommentStart:=CurCommentPos;
 | 
			
		||||
        end else if IsSpaceChar[Src[CommentStart]] then begin
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user