Skip to content

Commit 6b3cdaf

Browse files
committed
Optimize renaming of declarations named after keywords
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 1d7dc38 commit 6b3cdaf

File tree

9 files changed

+55
-62
lines changed

9 files changed

+55
-62
lines changed

src/CppParser/Bootstrap/Bootstrap.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1762,11 +1762,9 @@ public static string GetDeclName(Declaration decl,
17621762
}
17631763

17641764
if (!hasConflict)
1765-
name = CaseRenamePass.ConvertCaseString(decl,
1766-
RenameCasePattern.UpperCamelCase);
1767-
1768-
if (CSharpSources.IsReservedKeyword(name))
1769-
name = $"@{name}";
1765+
name = CSharpSources.SafeIdentifier(
1766+
CaseRenamePass.ConvertCaseString(decl,
1767+
RenameCasePattern.UpperCamelCase));
17701768
}
17711769
else throw new NotImplementedException();
17721770

src/Generator/Driver.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,10 @@ public void SetupPasses(ILibrary library)
277277

278278
if (Options.GeneratorKind == GeneratorKind.CLI ||
279279
Options.GeneratorKind == GeneratorKind.CSharp)
280-
TranslationUnitPasses.RenameDeclsUpperCase(RenameTargets.Any &~ RenameTargets.Parameter);
280+
{
281+
TranslationUnitPasses.RenameDeclsUpperCase(RenameTargets.Any & ~RenameTargets.Parameter);
282+
TranslationUnitPasses.AddPass(new CheckKeywordNamesPass());
283+
}
281284
}
282285

283286
public void ProcessCode()

src/Generator/Generators/C/CCodeGenerator.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,6 @@ public virtual string QualifiedName(Declaration decl)
4141
return decl.QualifiedName;
4242
}
4343

44-
public override string GeneratedIdentifier(string id)
45-
{
46-
return "__" + id.Replace('-', '_');
47-
}
48-
4944
private CppTypePrinter typePrinter = new CppTypePrinter();
5045
public virtual CppTypePrinter CTypePrinter => typePrinter;
5146

@@ -186,7 +181,7 @@ public override void GenerateClassSpecifier(Class @class)
186181

187182
if (Options.GeneratorKind == GeneratorKind.CLI)
188183
{
189-
keywords.Add(AccessIdentifier(@class.Access));
184+
keywords.Add(Helpers.GetAccess(@class.Access));
190185

191186
if (@class.IsAbstract)
192187
keywords.Add("abstract");

src/Generator/Generators/CSharp/CSharpSources.cs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,7 @@ private void Init()
5959
"void", "partial", "yield", "where"
6060
};
6161

62-
public static bool IsReservedKeyword(string id) => ReservedKeywords.Contains(id);
63-
64-
public override string SafeIdentifier(string id)
62+
public static string SafeIdentifier(string id)
6563
{
6664
if (id.All(char.IsLetterOrDigit))
6765
return ReservedKeywords.Contains(id) ? "@" + id : id;
@@ -246,7 +244,7 @@ public virtual void GenerateNamespaceFunctionsAndVariables(DeclarationContext co
246244
return;
247245

248246
PushBlock(BlockKind.Functions);
249-
var parentName = SafeIdentifier(context.TranslationUnit.FileNameWithoutExtension);
247+
var parentName = context.TranslationUnit.FileNameWithoutExtension;
250248

251249
var keyword = "class";
252250
var classes = EnumerateClasses().ToList();
@@ -724,7 +722,7 @@ public override void GenerateClassSpecifier(Class @class)
724722
keywords.Add("partial");
725723

726724
keywords.Add(@class.IsInterface ? "interface" : (@class.IsValueType ? "struct" : "class"));
727-
keywords.Add(SafeIdentifier(@class.Name));
725+
keywords.Add(@class.Name);
728726

729727
Write(string.Join(" ", keywords));
730728
if (@class.IsDependent && @class.TemplateParameters.Any())
@@ -927,7 +925,7 @@ private void GenerateFieldSetter(Field field, Class @class, QualifiedType fieldT
927925
else
928926
{
929927
var name = @class.Layout.Fields.First(f => f.FieldPtr == field.OriginalPtr).Name;
930-
var identifier = SafeIdentifier(name);
928+
var identifier = name;
931929
if (@class.IsValueType)
932930
returnVar = $"{Helpers.InstanceField}.{identifier}";
933931
else
@@ -998,7 +996,7 @@ private string HandleValueArray(ArrayType arrayType, Field field)
998996
var name = ((Class) field.Namespace).Layout.Fields.First(
999997
f => f.FieldPtr == field.OriginalPtr).Name;
1000998
WriteLine(string.Format("fixed ({0} {1} = {2}.{3})",
1001-
type, arrPtr, Helpers.InstanceField, SafeIdentifier(name)));
999+
type, arrPtr, Helpers.InstanceField, name));
10021000
WriteOpenBraceAndIndent();
10031001
return arrPtr;
10041002
}
@@ -1219,11 +1217,11 @@ private void GenerateFieldGetter(Field field, Class @class, QualifiedType return
12191217
if (arrayType != null)
12201218
returnVar = HandleValueArray(arrayType, field);
12211219
else
1222-
returnVar = $"{Helpers.InstanceField}.{SafeIdentifier(name)}";
1220+
returnVar = $"{Helpers.InstanceField}.{name}";
12231221
}
12241222
else
12251223
{
1226-
returnVar = $"(({TypePrinter.PrintNative(@class)}*) {Helpers.InstanceIdentifier})->{SafeIdentifier(name)}";
1224+
returnVar = $"(({TypePrinter.PrintNative(@class)}*) {Helpers.InstanceIdentifier})->{name}";
12271225
// Class field getter should return a reference object instead of a copy. Wrapping `returnVar` in
12281226
// IntPtr ensures that non-copying object constructor is invoked.
12291227
Class typeClass;
@@ -1372,8 +1370,8 @@ private void GenerateProperties(Class @class)
13721370
{
13731371
var name = @class.Layout.Fields.First(f => f.FieldPtr == prop.Field.OriginalPtr).Name;
13741372
GenerateClassField(prop.Field);
1375-
WriteLine("private bool {0};",
1376-
GeneratedIdentifier(string.Format("{0}Initialised", name)));
1373+
string safeIdentifier = name.StartsWith("@") ? name.Substring(1) : name;
1374+
WriteLine($"private bool __{safeIdentifier}Initialised;");
13771375
}
13781376

13791377
GenerateDeclarationCommon(prop);
@@ -1434,7 +1432,7 @@ private string GetPropertyName(Property prop)
14341432
{
14351433
var isIndexer = prop.Parameters.Count != 0;
14361434
if (!isIndexer)
1437-
return SafeIdentifier(prop.Name);
1435+
return prop.Name;
14381436

14391437
var @params = prop.Parameters.Select(param => {
14401438
var p = new Parameter(param);
@@ -3109,7 +3107,7 @@ public override bool VisitEnumDecl(Enumeration @enum)
31093107
// internal P/Invoke declarations must see protected enums
31103108
if (@enum.Access == AccessSpecifier.Protected)
31113109
Write("internal ");
3112-
Write("enum {0}", SafeIdentifier(@enum.Name));
3110+
Write("enum {0}", @enum.Name);
31133111

31143112
var typeName = TypePrinter.VisitPrimitiveType(@enum.BuiltinType.Type,
31153113
new TypeQualifiers());

src/Generator/Generators/CSharp/CSharpTypePrinter.cs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -739,22 +739,16 @@ private static string GetParameterUsage(ParameterUsage usage)
739739
public override TypePrinterResult VisitFieldDecl(Field field)
740740
{
741741
var cSharpSourcesDummy = new CSharpSources(Context, new List<TranslationUnit>());
742-
var safeIdentifier = cSharpSourcesDummy.SafeIdentifier(field.Name);
743742

744-
if (safeIdentifier.All(c => c.Equals('_')))
745-
{
746-
safeIdentifier = cSharpSourcesDummy.SafeIdentifier(field.Name);
747-
}
748-
749-
PushMarshalKind(MarshalKind.NativeField);
743+
PushMarshalKind(MarshalKind.NativeField);
750744
var fieldTypePrinted = field.QualifiedType.Visit(this);
751745
PopMarshalKind();
752-
746+
753747
var returnTypePrinter = new TypePrinterResult();
754748
if (!string.IsNullOrWhiteSpace(fieldTypePrinted.NameSuffix))
755749
returnTypePrinter.NameSuffix = fieldTypePrinted.NameSuffix;
756750

757-
returnTypePrinter.Type = $"{fieldTypePrinted.Type} {safeIdentifier}";
751+
returnTypePrinter.Type = $"{fieldTypePrinted.Type} {field.Name}";
758752

759753
return returnTypePrinter;
760754
}

src/Generator/Generators/CodeGenerator.cs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -105,19 +105,6 @@ public virtual void GenerateDebug(Declaration decl)
105105

106106
#endregion
107107

108-
#region Identifiers generation
109-
110-
public virtual string SafeIdentifier(string id) => id;
111-
112-
public virtual string GeneratedIdentifier(string id) => Generator.GeneratedIdentifier(id);
113-
114-
public virtual string AccessIdentifier(AccessSpecifier accessSpecifier)
115-
{
116-
return Helpers.GetAccess(accessSpecifier);
117-
}
118-
119-
#endregion
120-
121108
#region Comment generation
122109

123110
public virtual void GenerateSummary(string comment)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using CppSharp.AST;
2+
using CppSharp.Generators.CSharp;
3+
4+
namespace CppSharp.Passes
5+
{
6+
public class CheckKeywordNamesPass : TranslationUnitPass
7+
{
8+
public override bool VisitClassDecl(Class @class)
9+
{
10+
if (!base.VisitClassDecl(@class) || @class.Layout == null)
11+
return false;
12+
13+
foreach (var field in @class.Layout.Fields)
14+
field.Name = SafeIdentifier(field.Name);
15+
16+
return true;
17+
}
18+
19+
public override bool VisitDeclaration(Declaration decl)
20+
{
21+
if (!base.VisitDeclaration(decl) || decl.Ignore)
22+
return false;
23+
24+
decl.Name = SafeIdentifier(decl.Name);
25+
return true;
26+
}
27+
28+
private string SafeIdentifier(string id) =>
29+
Options.IsCLIGenerator ? id : CSharpSources.SafeIdentifier(id);
30+
}
31+
}

src/Generator/Passes/CleanInvalidDeclNamesPass.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,12 @@
22
using System.Linq;
33
using System.Text;
44
using CppSharp.AST;
5-
using CppSharp.Generators.CLI;
6-
using CppSharp.Generators.CSharp;
75
using CppSharp.Generators;
86

97
namespace CppSharp.Passes
108
{
119
public class CleanInvalidDeclNamesPass : TranslationUnitPass
1210
{
13-
public override bool VisitASTContext(ASTContext context)
14-
{
15-
// TODO: Fix this to not need per-generator code.
16-
generator = Options.IsCLIGenerator ?
17-
new CLIHeaders(Context, new List<TranslationUnit>()) :
18-
(CodeGenerator) new CSharpSources(Context);
19-
return base.VisitASTContext(context);
20-
}
21-
2211
public override bool VisitClassDecl(Class @class)
2312
{
2413
if (!base.VisitClassDecl(@class))
@@ -138,10 +127,8 @@ private string CheckName(string name, ref int order)
138127
if (char.IsNumber(name[0]))
139128
return '_' + name;
140129

141-
return generator.SafeIdentifier(name);
130+
return name;
142131
}
143-
144-
private CodeGenerator generator;
145132
}
146133
}
147134

src/Generator/Passes/SpecializationMethodsWithDependentPointersPass.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ private static Method GetExtensionMethodForDependentPointer(Method specializedMe
129129
var thisParameter = new Parameter();
130130
thisParameter.QualifiedType = new QualifiedType(new PointerType(
131131
new QualifiedType(new TagType(specializedMethod.Namespace))));
132-
thisParameter.Name = "@this";
132+
thisParameter.Name = "this";
133133
thisParameter.Kind = ParameterKind.Extension;
134134
thisParameter.Namespace = extensionMethod;
135135
extensionMethod.Parameters.Insert(0, thisParameter);

0 commit comments

Comments
 (0)