diff --git a/components/codetools/codecompletiontool.pas b/components/codetools/codecompletiontool.pas index 7999caa2e9..323226d52d 100644 --- a/components/codetools/codecompletiontool.pas +++ b/components/codetools/codecompletiontool.pas @@ -8935,6 +8935,13 @@ begin {$ENDIF} exit(true); end; + if FindClassExternalNode(CodeCompleteClassNode)<>nil then begin + // external class has no implementations + {$IF defined(CTDEBUG) or defined(VerboseCreateMissingClassProcBodies)} + debugln(['TCodeCompletionCodeTool.CreateMissingClassProcBodies external ',CodeCompleteClassNode.DescAsString]); + {$ENDIF} + exit(true); + end; Result:=false; Beauty:=FSourceChangeCache.BeautifyCodeOptions; diff --git a/components/codetools/linkscanner.pas b/components/codetools/linkscanner.pas index 39c627b394..3842529c5f 100644 --- a/components/codetools/linkscanner.pas +++ b/components/codetools/linkscanner.pas @@ -195,7 +195,8 @@ type cmsDefault_unicodestring, { makes the default string type in $h+ mode unicodestring rather than ansistring; similarly, char becomes unicodechar rather than ansichar } cmsTypeHelpers, - cmsBlocks + cmsBlocks, + cmsExternalClass { allow class external [pkgname] name [symbol] } ); TCompilerModeSwitches = set of TCompilerModeSwitch; const @@ -797,7 +798,8 @@ const 'FINALFIELDS', 'UNICODESTRINGS', 'TYPEHELPERS', - 'BLOCKS' + 'BLOCKS', + 'EXTERNALCLASS' ); // upper case diff --git a/components/codetools/pascalparsertool.pas b/components/codetools/pascalparsertool.pas index b6e0a6f9b6..52c7b4772c 100644 --- a/components/codetools/pascalparsertool.pas +++ b/components/codetools/pascalparsertool.pas @@ -4359,9 +4359,11 @@ begin end; if UpAtomIs('EXTERNAL') then begin if (ClassDesc in [ctnObjCClass,ctnObjCCategory]) + or (cmsExternalClass in Scanner.CompilerModeSwitches) or Scanner.Values.IsDefined('CPUJVM') then begin // objcclass external [name ''] // cpujvm: class external '' [name ''] + // externalclass: class external [''] name '' CreateChildNode; CurNode.Desc:=ctnClassExternal; ReadNextAtom; diff --git a/components/codetools/pascalreadertool.pas b/components/codetools/pascalreadertool.pas index 21d6458128..6597e02303 100644 --- a/components/codetools/pascalreadertool.pas +++ b/components/codetools/pascalreadertool.pas @@ -225,6 +225,7 @@ type function IsClassNode(Node: TCodeTreeNode): boolean; // class, not object function FindInheritanceNode(ClassNode: TCodeTreeNode): TCodeTreeNode; function FindHelperForNode(HelperNode: TCodeTreeNode): TCodeTreeNode; + function FindClassExternalNode(ClassNode: TCodeTreeNode): TCodeTreeNode; function IdentNodeIsInVisibleClassSection(Node: TCodeTreeNode; Visibility: TClassSectionVisibility): Boolean; // records @@ -3066,6 +3067,19 @@ begin Result:=nil; end; +function TPascalReaderTool.FindClassExternalNode(ClassNode: TCodeTreeNode + ): TCodeTreeNode; +begin + if ClassNode=nil then exit; + Result:=ClassNode.FirstChild; + while (Result<>nil) do + begin + if Result.Desc=ctnClassExternal then exit; + if Result.Desc in AllClassBaseSections then exit(nil); + Result:=Result.NextBrother; + end; +end; + function TPascalReaderTool.FindTypeOfForwardNode(TypeNode: TCodeTreeNode ): TCodeTreeNode;