IDE: codetools word beautifier: option to define how to spell auto created words, bug #19973

git-svn-id: trunk@34633 -
This commit is contained in:
mattias 2012-01-06 22:44:48 +00:00
parent bdad5a8977
commit 18106c64f2
6 changed files with 146 additions and 7 deletions

View File

@ -92,6 +92,21 @@ const
DefaultUsesInsertPolicy = uipBehindRelated; DefaultUsesInsertPolicy = uipBehindRelated;
type type
TWordException = class
Word: string;
end;
{ TWordExceptions }
TWordExceptions = class
private
FWords: TAVLTree;
public
constructor Create(AWords: TStrings);
destructor Destroy; override;
function CheckExceptions(var AWord: string): Boolean;
end;
{ TBeautifyCodeOptions } { TBeautifyCodeOptions }
TBeautifyCodeOptions = class(TPersistent) TBeautifyCodeOptions = class(TPersistent)
@ -118,6 +133,7 @@ type
TabWidth: integer; TabWidth: integer;
KeyWordPolicy: TWordPolicy; KeyWordPolicy: TWordPolicy;
IdentifierPolicy: TWordPolicy; IdentifierPolicy: TWordPolicy;
WordExceptions: TWordExceptions;
DoNotSplitLineInFront: TAtomTypes; DoNotSplitLineInFront: TAtomTypes;
DoNotSplitLineAfter: TAtomTypes; DoNotSplitLineAfter: TAtomTypes;
DoInsertSpaceInFront: TAtomTypes; DoInsertSpaceInFront: TAtomTypes;
@ -144,6 +160,7 @@ type
NestedComments: boolean; NestedComments: boolean;
procedure SetupWordExceptions(ws: TStrings);
function BeautifyProc(const AProcCode: string; IndentSize: integer; function BeautifyProc(const AProcCode: string; IndentSize: integer;
AddBeginEnd: boolean): string; AddBeginEnd: boolean): string;
function BeautifyStatement(const AStatement: string; IndentSize: integer function BeautifyStatement(const AStatement: string; IndentSize: integer
@ -160,6 +177,7 @@ type
procedure ConsistencyCheck; procedure ConsistencyCheck;
procedure WriteDebugReport; procedure WriteDebugReport;
constructor Create; constructor Create;
destructor Destroy; override;
end; end;
@ -427,6 +445,65 @@ begin
end; end;
end; end;
function CompareWordExceptions(p1, p2: Pointer): Integer;
var w1, w2: string;
begin
w1 := TWordException(p1).Word;
w2 := TWordException(p2).Word;
Result := CompareIdentifiers(PChar(w1), PChar(w2));
end;
function CompareKeyWordExceptions(Item1, Item2: Pointer): Integer;
begin
Result := CompareIdentifiers(PChar(Item1), PChar(TWordException(Item2).Word));
end;
{ TWordExceptions }
constructor TWordExceptions.Create(AWords: TStrings);
var
i, j: Integer;
s1, s2: string;
we: TWordException;
begin
FWords := TAVLTree.Create(@CompareWordExceptions);
for i := 0 to AWords.Count - 1 do
begin
s1 := AWords[i] + ' ';
for j := 1 to Length(s1) do
if not (s1[j] in [' ', 'a'..'z', 'A'..'Z', '0'..'9', '_']) then
s1[j] := ' ';
while Pos(' ', s1) > 0 do
Delete(s1, Pos(' ', s1), 1);
while s1 <> '' do
begin
s2 := Copy(s1, 1, Pos(' ', s1) - 1);
Delete(s1, 1, Pos(' ', s1));
if s2 <> '' then
begin
we := TWordException.Create;
we.Word := s2;
FWords.Add(we);
end;
end;
end;
end;
destructor TWordExceptions.Destroy;
begin
FWords.FreeAndClear;
FWords.Free;
inherited Destroy;
end;
function TWordExceptions.CheckExceptions(var AWord: string): Boolean;
var n: TAVLTreeNode;
begin
n := FWords.FindKey(PChar(AWord), @CompareKeyWordExceptions);
Result := Assigned(n);
if Result then AWord := TWordException(n.Data).Word;
end;
{ TSourceChangeCacheEntry } { TSourceChangeCacheEntry }
constructor TSourceChangeCacheEntry.Create(aFrontGap, anAfterGap: TGapTyp; constructor TSourceChangeCacheEntry.Create(aFrontGap, anAfterGap: TGapTyp;
@ -1168,6 +1245,12 @@ begin
NestedComments:=true; NestedComments:=true;
end; end;
destructor TBeautifyCodeOptions.Destroy;
begin
WordExceptions.Free;
inherited Destroy;
end;
procedure TBeautifyCodeOptions.AddAtom(var CurCode: string; NewAtom: string); procedure TBeautifyCodeOptions.AddAtom(var CurCode: string; NewAtom: string);
var var
RestLineLen, LastLineEndInAtom: integer; RestLineLen, LastLineEndInAtom: integer;
@ -1510,6 +1593,12 @@ begin
Result:=false; Result:=false;
end; end;
procedure TBeautifyCodeOptions.SetupWordExceptions(ws: TStrings);
begin
if Assigned(WordExceptions) then WordExceptions.Free;
WordExceptions := TWordExceptions.Create(ws);
end;
function TBeautifyCodeOptions.BeautifyProc(const AProcCode: string; function TBeautifyCodeOptions.BeautifyProc(const AProcCode: string;
IndentSize: integer; AddBeginEnd: boolean): string; IndentSize: integer; AddBeginEnd: boolean): string;
begin begin
@ -1711,13 +1800,14 @@ end;
function TBeautifyCodeOptions.BeautifyWord(const AWord: string; function TBeautifyCodeOptions.BeautifyWord(const AWord: string;
WordPolicy: TWordPolicy): string; WordPolicy: TWordPolicy): string;
begin begin
Result := AWord;
if Assigned(WordExceptions) and WordExceptions.CheckExceptions(Result) then
Exit;
case WordPolicy of case WordPolicy of
wpLowerCase: Result:=lowercase(AWord); wpLowerCase: Result:=lowercase(AWord);
wpUpperCase: Result:=UpperCaseStr(AWord); wpUpperCase: Result:=UpperCaseStr(AWord);
wpLowerCaseFirstLetterUp: Result:=UpperCaseStr(copy(AWord,1,1)) wpLowerCaseFirstLetterUp: Result:=UpperCaseStr(copy(AWord,1,1))
+lowercase(copy(AWord,2,length(AWord)-1)); +lowercase(copy(AWord,2,length(AWord)-1));
else
Result:=AWord;
end; end;
end; end;

View File

@ -80,6 +80,7 @@ type
FMethodInsertPolicy: TMethodInsertPolicy; FMethodInsertPolicy: TMethodInsertPolicy;
FKeyWordPolicy : TWordPolicy; FKeyWordPolicy : TWordPolicy;
FIdentifierPolicy: TWordPolicy; FIdentifierPolicy: TWordPolicy;
FWordExceptions: TStringList;
FDoNotSplitLineInFront: TAtomTypes; FDoNotSplitLineInFront: TAtomTypes;
FDoNotSplitLineAfter: TAtomTypes; FDoNotSplitLineAfter: TAtomTypes;
FDoInsertSpaceInFront: TAtomTypes; FDoInsertSpaceInFront: TAtomTypes;
@ -166,6 +167,8 @@ type
read FKeyWordPolicy write FKeyWordPolicy; read FKeyWordPolicy write FKeyWordPolicy;
property IdentifierPolicy: TWordPolicy property IdentifierPolicy: TWordPolicy
read FIdentifierPolicy write FIdentifierPolicy; read FIdentifierPolicy write FIdentifierPolicy;
property WordExceptions: TStringList
read FWordExceptions write FWordExceptions;
property DoNotSplitLineInFront: TAtomTypes property DoNotSplitLineInFront: TAtomTypes
read FDoNotSplitLineInFront write FDoNotSplitLineInFront; read FDoNotSplitLineInFront write FDoNotSplitLineInFront;
property DoNotSplitLineAfter: TAtomTypes property DoNotSplitLineAfter: TAtomTypes
@ -304,12 +307,14 @@ constructor TCodeToolsOptions.Create;
begin begin
inherited Create; inherited Create;
FFilename:=''; FFilename:='';
FWordExceptions := TStringList.Create;
Clear; Clear;
end; end;
destructor TCodeToolsOptions.Destroy; destructor TCodeToolsOptions.Destroy;
begin begin
ClearGlobalDefineTemplates; ClearGlobalDefineTemplates;
FWordExceptions.Free;
inherited Destroy; inherited Destroy;
end; end;
@ -412,6 +417,8 @@ begin
FIdentifierPolicy:=WordPolicyNameToPolicy(XMLConfig.GetValue( FIdentifierPolicy:=WordPolicyNameToPolicy(XMLConfig.GetValue(
'CodeToolsOptions/IdentifierPolicy/Value', 'CodeToolsOptions/IdentifierPolicy/Value',
WordPolicyNames[wpNone])); WordPolicyNames[wpNone]));
WordExceptions.Text:=LineBreaksToSystemLineBreaks(XMLConfig.GetValue(
'CodeToolsOptions/WordExceptions/Value', ''));
FDoNotSplitLineInFront:=ReadAtomTypesFromXML(XMLConfig, FDoNotSplitLineInFront:=ReadAtomTypesFromXML(XMLConfig,
'CodeToolsOptions/DoNotSplitLineInFront/',DefaultDoNotSplitLineInFront); 'CodeToolsOptions/DoNotSplitLineInFront/',DefaultDoNotSplitLineInFront);
FDoNotSplitLineAfter:=ReadAtomTypesFromXML(XMLConfig, FDoNotSplitLineAfter:=ReadAtomTypesFromXML(XMLConfig,
@ -538,6 +545,9 @@ begin
XMLConfig.SetDeleteValue('CodeToolsOptions/IdentifierPolicy/Value', XMLConfig.SetDeleteValue('CodeToolsOptions/IdentifierPolicy/Value',
WordPolicyNames[FIdentifierPolicy], WordPolicyNames[FIdentifierPolicy],
WordPolicyNames[wpNone]); WordPolicyNames[wpNone]);
XMLConfig.SetDeleteValue('CodeToolsOptions/WordExceptions/Value',
LineBreaksToSystemLineBreaks(WordExceptions.Text),
'');
WriteAtomTypesToXML(XMLConfig,'CodeToolsOptions/DoNotSplitLineInFront/', WriteAtomTypesToXML(XMLConfig,'CodeToolsOptions/DoNotSplitLineInFront/',
FDoNotSplitLineInFront,DefaultDoNotSplitLineInFront); FDoNotSplitLineInFront,DefaultDoNotSplitLineInFront);
WriteAtomTypesToXML(XMLConfig,'CodeToolsOptions/DoNotSplitLineAfter/', WriteAtomTypesToXML(XMLConfig,'CodeToolsOptions/DoNotSplitLineAfter/',
@ -866,6 +876,7 @@ begin
BeautifyCodeOptions.MethodInsertPolicy:=MethodInsertPolicy; BeautifyCodeOptions.MethodInsertPolicy:=MethodInsertPolicy;
BeautifyCodeOptions.KeyWordPolicy:=KeyWordPolicy; BeautifyCodeOptions.KeyWordPolicy:=KeyWordPolicy;
BeautifyCodeOptions.IdentifierPolicy:=IdentifierPolicy; BeautifyCodeOptions.IdentifierPolicy:=IdentifierPolicy;
BeautifyCodeOptions.SetupWordExceptions(WordExceptions);
BeautifyCodeOptions.DoNotSplitLineInFront:=DoNotSplitLineInFront; BeautifyCodeOptions.DoNotSplitLineInFront:=DoNotSplitLineInFront;
BeautifyCodeOptions.DoNotSplitLineAfter:=DoNotSplitLineAfter; BeautifyCodeOptions.DoNotSplitLineAfter:=DoNotSplitLineAfter;
BeautifyCodeOptions.DoInsertSpaceInFront:=DoInsertSpaceInFront; BeautifyCodeOptions.DoInsertSpaceInFront:=DoInsertSpaceInFront;

View File

@ -1,12 +1,12 @@
inherited CodetoolsWordPolicyOptionsFrame: TCodetoolsWordPolicyOptionsFrame inherited CodetoolsWordPolicyOptionsFrame: TCodetoolsWordPolicyOptionsFrame
Height = 270 Height = 355
Width = 483 Width = 483
ClientHeight = 270 ClientHeight = 355
ClientWidth = 483 ClientWidth = 483
TabOrder = 0 TabOrder = 0
Visible = False Visible = False
DesignLeft = 340 DesignLeft = 340
DesignTop = 308 DesignTop = 252
object KeyWordPolicyRadioGroup: TRadioGroup[0] object KeyWordPolicyRadioGroup: TRadioGroup[0]
AnchorSideLeft.Control = Owner AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner AnchorSideTop.Control = Owner
@ -38,7 +38,7 @@ inherited CodetoolsWordPolicyOptionsFrame: TCodetoolsWordPolicyOptionsFrame
AnchorSideRight.Control = Owner AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
Left = 0 Left = 0
Height = 100 Height = 102
Top = 106 Top = 106
Width = 483 Width = 483
Anchors = [akTop, akLeft, akRight] Anchors = [akTop, akLeft, akRight]
@ -57,4 +57,31 @@ inherited CodetoolsWordPolicyOptionsFrame: TCodetoolsWordPolicyOptionsFrame
Constraints.MinHeight = 100 Constraints.MinHeight = 100
TabOrder = 1 TabOrder = 1
end end
object WordExceptionsGroupBox: TGroupBox[2]
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = IdentifierPolicyRadioGroup
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 0
Height = 138
Top = 214
Width = 483
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
Caption = 'WordExceptionsGroupBox'
ClientHeight = 120
ClientWidth = 479
TabOrder = 2
object WordExceptionsMemo: TMemo
Left = 6
Height = 108
Top = 6
Width = 467
Align = alClient
BorderSpacing.Around = 6
ScrollBars = ssAutoVertical
TabOrder = 0
end
end
end end

View File

@ -25,7 +25,7 @@ unit codetools_wordpolicy_options;
interface interface
uses uses
Classes, SysUtils, FileUtil, Forms, ExtCtrls, Classes, SysUtils, FileUtil, Forms, ExtCtrls, StdCtrls,
SourceChanger, CodeToolsOptions, LazarusIDEStrConsts, IDEOptionsIntf; SourceChanger, CodeToolsOptions, LazarusIDEStrConsts, IDEOptionsIntf;
type type
@ -33,6 +33,8 @@ type
{ TCodetoolsWordPolicyOptionsFrame } { TCodetoolsWordPolicyOptionsFrame }
TCodetoolsWordPolicyOptionsFrame = class(TAbstractIDEOptionsEditor) TCodetoolsWordPolicyOptionsFrame = class(TAbstractIDEOptionsEditor)
WordExceptionsMemo: TMemo;
WordExceptionsGroupBox: TGroupBox;
IdentifierPolicyRadioGroup: TRadioGroup; IdentifierPolicyRadioGroup: TRadioGroup;
KeyWordPolicyRadioGroup: TRadioGroup; KeyWordPolicyRadioGroup: TRadioGroup;
private private
@ -82,6 +84,8 @@ begin
EndUpdate; EndUpdate;
end; end;
end; end;
WordExceptionsGroupBox.Caption := dlgWordExceptions;
end; end;
procedure TCodetoolsWordPolicyOptionsFrame.ReadSettings( procedure TCodetoolsWordPolicyOptionsFrame.ReadSettings(
@ -111,6 +115,7 @@ begin
// wpNone // wpNone
IdentifierPolicyRadioGroup.ItemIndex:=0; IdentifierPolicyRadioGroup.ItemIndex:=0;
end; end;
WordExceptionsMemo.Lines.Assign(WordExceptions);
end; end;
end; end;
@ -131,6 +136,7 @@ begin
2: IdentifierPolicy:=wpUpperCase; 2: IdentifierPolicy:=wpUpperCase;
3: IdentifierPolicy:=wpLowerCaseFirstLetterUp; 3: IdentifierPolicy:=wpLowerCaseFirstLetterUp;
end; end;
WordExceptions.Assign(WordExceptionsMemo.Lines);
end; end;
end; end;

View File

@ -1772,6 +1772,7 @@ resourcestring
dlgCDTUPPERCASE = 'UPPERCASE'; dlgCDTUPPERCASE = 'UPPERCASE';
dlg1UP2low = 'Lowercase, first letter up'; dlg1UP2low = 'Lowercase, first letter up';
dlgIdentifierPolicy = 'Identifier policy'; dlgIdentifierPolicy = 'Identifier policy';
dlgWordExceptions = 'Exceptions';
dlgPropertyCompletion = 'Property completion'; dlgPropertyCompletion = 'Property completion';
lisHeaderCommentForClass = 'Header comment for class'; lisHeaderCommentForClass = 'Header comment for class';
lisImplementationCommentForClass = 'Implementation comment for class'; lisImplementationCommentForClass = 'Implementation comment for class';

View File

@ -345,6 +345,8 @@ begin
SetFontColor(ForegroundColor); SetFontColor(ForegroundColor);
ACanvas.Font.Style:=ACanvas.Font.Style+[fsBold]; ACanvas.Font.Style:=ACanvas.Font.Style+[fsBold];
s:=IdentItem.Identifier; s:=IdentItem.Identifier;
with CodeToolBoss.SourceChangeCache.BeautifyCodeOptions do
WordExceptions.CheckExceptions(s);
if MeasureOnly then if MeasureOnly then
Inc(Result.X, 1+ACanvas.TextWidth(s)) Inc(Result.X, 1+ACanvas.TextWidth(s))
else begin else begin
@ -570,6 +572,8 @@ begin
IsReadOnly:=false; IsReadOnly:=false;
Result:=IdentItem.Identifier; Result:=IdentItem.Identifier;
with CodeToolBoss.SourceChangeCache.BeautifyCodeOptions do
WordExceptions.CheckExceptions(Result);
case IdentItem.GetDesc of case IdentItem.GetDesc of