Browse Source

Optimize renaming of declarations named after keywords

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1210/head
Dimitar Dobrev 6 years ago
parent
commit
6b3cdaffb7
  1. 8
      src/CppParser/Bootstrap/Bootstrap.cs
  2. 5
      src/Generator/Driver.cs
  3. 7
      src/Generator/Generators/C/CCodeGenerator.cs
  4. 24
      src/Generator/Generators/CSharp/CSharpSources.cs
  5. 12
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  6. 13
      src/Generator/Generators/CodeGenerator.cs
  7. 31
      src/Generator/Passes/CheckKeywordNamesPass.cs
  8. 15
      src/Generator/Passes/CleanInvalidDeclNamesPass.cs
  9. 2
      src/Generator/Passes/SpecializationMethodsWithDependentPointersPass.cs

8
src/CppParser/Bootstrap/Bootstrap.cs

@ -1762,11 +1762,9 @@ namespace CppSharp @@ -1762,11 +1762,9 @@ namespace CppSharp
}
if (!hasConflict)
name = CaseRenamePass.ConvertCaseString(decl,
RenameCasePattern.UpperCamelCase);
if (CSharpSources.IsReservedKeyword(name))
name = $"@{name}";
name = CSharpSources.SafeIdentifier(
CaseRenamePass.ConvertCaseString(decl,
RenameCasePattern.UpperCamelCase));
}
else throw new NotImplementedException();

5
src/Generator/Driver.cs

@ -277,7 +277,10 @@ namespace CppSharp @@ -277,7 +277,10 @@ namespace CppSharp
if (Options.GeneratorKind == GeneratorKind.CLI ||
Options.GeneratorKind == GeneratorKind.CSharp)
TranslationUnitPasses.RenameDeclsUpperCase(RenameTargets.Any &~ RenameTargets.Parameter);
{
TranslationUnitPasses.RenameDeclsUpperCase(RenameTargets.Any & ~RenameTargets.Parameter);
TranslationUnitPasses.AddPass(new CheckKeywordNamesPass());
}
}
public void ProcessCode()

7
src/Generator/Generators/C/CCodeGenerator.cs

@ -41,11 +41,6 @@ namespace CppSharp.Generators.C @@ -41,11 +41,6 @@ namespace CppSharp.Generators.C
return decl.QualifiedName;
}
public override string GeneratedIdentifier(string id)
{
return "__" + id.Replace('-', '_');
}
private CppTypePrinter typePrinter = new CppTypePrinter();
public virtual CppTypePrinter CTypePrinter => typePrinter;
@ -186,7 +181,7 @@ namespace CppSharp.Generators.C @@ -186,7 +181,7 @@ namespace CppSharp.Generators.C
if (Options.GeneratorKind == GeneratorKind.CLI)
{
keywords.Add(AccessIdentifier(@class.Access));
keywords.Add(Helpers.GetAccess(@class.Access));
if (@class.IsAbstract)
keywords.Add("abstract");

24
src/Generator/Generators/CSharp/CSharpSources.cs

@ -59,9 +59,7 @@ namespace CppSharp.Generators.CSharp @@ -59,9 +59,7 @@ namespace CppSharp.Generators.CSharp
"void", "partial", "yield", "where"
};
public static bool IsReservedKeyword(string id) => ReservedKeywords.Contains(id);
public override string SafeIdentifier(string id)
public static string SafeIdentifier(string id)
{
if (id.All(char.IsLetterOrDigit))
return ReservedKeywords.Contains(id) ? "@" + id : id;
@ -246,7 +244,7 @@ namespace CppSharp.Generators.CSharp @@ -246,7 +244,7 @@ namespace CppSharp.Generators.CSharp
return;
PushBlock(BlockKind.Functions);
var parentName = SafeIdentifier(context.TranslationUnit.FileNameWithoutExtension);
var parentName = context.TranslationUnit.FileNameWithoutExtension;
var keyword = "class";
var classes = EnumerateClasses().ToList();
@ -724,7 +722,7 @@ namespace CppSharp.Generators.CSharp @@ -724,7 +722,7 @@ namespace CppSharp.Generators.CSharp
keywords.Add("partial");
keywords.Add(@class.IsInterface ? "interface" : (@class.IsValueType ? "struct" : "class"));
keywords.Add(SafeIdentifier(@class.Name));
keywords.Add(@class.Name);
Write(string.Join(" ", keywords));
if (@class.IsDependent && @class.TemplateParameters.Any())
@ -927,7 +925,7 @@ namespace CppSharp.Generators.CSharp @@ -927,7 +925,7 @@ namespace CppSharp.Generators.CSharp
else
{
var name = @class.Layout.Fields.First(f => f.FieldPtr == field.OriginalPtr).Name;
var identifier = SafeIdentifier(name);
var identifier = name;
if (@class.IsValueType)
returnVar = $"{Helpers.InstanceField}.{identifier}";
else
@ -998,7 +996,7 @@ namespace CppSharp.Generators.CSharp @@ -998,7 +996,7 @@ namespace CppSharp.Generators.CSharp
var name = ((Class) field.Namespace).Layout.Fields.First(
f => f.FieldPtr == field.OriginalPtr).Name;
WriteLine(string.Format("fixed ({0} {1} = {2}.{3})",
type, arrPtr, Helpers.InstanceField, SafeIdentifier(name)));
type, arrPtr, Helpers.InstanceField, name));
WriteOpenBraceAndIndent();
return arrPtr;
}
@ -1219,11 +1217,11 @@ namespace CppSharp.Generators.CSharp @@ -1219,11 +1217,11 @@ namespace CppSharp.Generators.CSharp
if (arrayType != null)
returnVar = HandleValueArray(arrayType, field);
else
returnVar = $"{Helpers.InstanceField}.{SafeIdentifier(name)}";
returnVar = $"{Helpers.InstanceField}.{name}";
}
else
{
returnVar = $"(({TypePrinter.PrintNative(@class)}*) {Helpers.InstanceIdentifier})->{SafeIdentifier(name)}";
returnVar = $"(({TypePrinter.PrintNative(@class)}*) {Helpers.InstanceIdentifier})->{name}";
// Class field getter should return a reference object instead of a copy. Wrapping `returnVar` in
// IntPtr ensures that non-copying object constructor is invoked.
Class typeClass;
@ -1372,8 +1370,8 @@ namespace CppSharp.Generators.CSharp @@ -1372,8 +1370,8 @@ namespace CppSharp.Generators.CSharp
{
var name = @class.Layout.Fields.First(f => f.FieldPtr == prop.Field.OriginalPtr).Name;
GenerateClassField(prop.Field);
WriteLine("private bool {0};",
GeneratedIdentifier(string.Format("{0}Initialised", name)));
string safeIdentifier = name.StartsWith("@") ? name.Substring(1) : name;
WriteLine($"private bool __{safeIdentifier}Initialised;");
}
GenerateDeclarationCommon(prop);
@ -1434,7 +1432,7 @@ namespace CppSharp.Generators.CSharp @@ -1434,7 +1432,7 @@ namespace CppSharp.Generators.CSharp
{
var isIndexer = prop.Parameters.Count != 0;
if (!isIndexer)
return SafeIdentifier(prop.Name);
return prop.Name;
var @params = prop.Parameters.Select(param => {
var p = new Parameter(param);
@ -3109,7 +3107,7 @@ namespace CppSharp.Generators.CSharp @@ -3109,7 +3107,7 @@ namespace CppSharp.Generators.CSharp
// internal P/Invoke declarations must see protected enums
if (@enum.Access == AccessSpecifier.Protected)
Write("internal ");
Write("enum {0}", SafeIdentifier(@enum.Name));
Write("enum {0}", @enum.Name);
var typeName = TypePrinter.VisitPrimitiveType(@enum.BuiltinType.Type,
new TypeQualifiers());

12
src/Generator/Generators/CSharp/CSharpTypePrinter.cs

@ -739,22 +739,16 @@ namespace CppSharp.Generators.CSharp @@ -739,22 +739,16 @@ namespace CppSharp.Generators.CSharp
public override TypePrinterResult VisitFieldDecl(Field field)
{
var cSharpSourcesDummy = new CSharpSources(Context, new List<TranslationUnit>());
var safeIdentifier = cSharpSourcesDummy.SafeIdentifier(field.Name);
if (safeIdentifier.All(c => c.Equals('_')))
{
safeIdentifier = cSharpSourcesDummy.SafeIdentifier(field.Name);
}
PushMarshalKind(MarshalKind.NativeField);
PushMarshalKind(MarshalKind.NativeField);
var fieldTypePrinted = field.QualifiedType.Visit(this);
PopMarshalKind();
var returnTypePrinter = new TypePrinterResult();
if (!string.IsNullOrWhiteSpace(fieldTypePrinted.NameSuffix))
returnTypePrinter.NameSuffix = fieldTypePrinted.NameSuffix;
returnTypePrinter.Type = $"{fieldTypePrinted.Type} {safeIdentifier}";
returnTypePrinter.Type = $"{fieldTypePrinted.Type} {field.Name}";
return returnTypePrinter;
}

13
src/Generator/Generators/CodeGenerator.cs

@ -105,19 +105,6 @@ namespace CppSharp.Generators @@ -105,19 +105,6 @@ namespace CppSharp.Generators
#endregion
#region Identifiers generation
public virtual string SafeIdentifier(string id) => id;
public virtual string GeneratedIdentifier(string id) => Generator.GeneratedIdentifier(id);
public virtual string AccessIdentifier(AccessSpecifier accessSpecifier)
{
return Helpers.GetAccess(accessSpecifier);
}
#endregion
#region Comment generation
public virtual void GenerateSummary(string comment)

31
src/Generator/Passes/CheckKeywordNamesPass.cs

@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
using CppSharp.AST;
using CppSharp.Generators.CSharp;
namespace CppSharp.Passes
{
public class CheckKeywordNamesPass : TranslationUnitPass
{
public override bool VisitClassDecl(Class @class)
{
if (!base.VisitClassDecl(@class) || @class.Layout == null)
return false;
foreach (var field in @class.Layout.Fields)
field.Name = SafeIdentifier(field.Name);
return true;
}
public override bool VisitDeclaration(Declaration decl)
{
if (!base.VisitDeclaration(decl) || decl.Ignore)
return false;
decl.Name = SafeIdentifier(decl.Name);
return true;
}
private string SafeIdentifier(string id) =>
Options.IsCLIGenerator ? id : CSharpSources.SafeIdentifier(id);
}
}

15
src/Generator/Passes/CleanInvalidDeclNamesPass.cs

@ -2,23 +2,12 @@ @@ -2,23 +2,12 @@
using System.Linq;
using System.Text;
using CppSharp.AST;
using CppSharp.Generators.CLI;
using CppSharp.Generators.CSharp;
using CppSharp.Generators;
namespace CppSharp.Passes
{
public class CleanInvalidDeclNamesPass : TranslationUnitPass
{
public override bool VisitASTContext(ASTContext context)
{
// TODO: Fix this to not need per-generator code.
generator = Options.IsCLIGenerator ?
new CLIHeaders(Context, new List<TranslationUnit>()) :
(CodeGenerator) new CSharpSources(Context);
return base.VisitASTContext(context);
}
public override bool VisitClassDecl(Class @class)
{
if (!base.VisitClassDecl(@class))
@ -138,10 +127,8 @@ namespace CppSharp.Passes @@ -138,10 +127,8 @@ namespace CppSharp.Passes
if (char.IsNumber(name[0]))
return '_' + name;
return generator.SafeIdentifier(name);
return name;
}
private CodeGenerator generator;
}
}

2
src/Generator/Passes/SpecializationMethodsWithDependentPointersPass.cs

@ -129,7 +129,7 @@ namespace CppSharp.Passes @@ -129,7 +129,7 @@ namespace CppSharp.Passes
var thisParameter = new Parameter();
thisParameter.QualifiedType = new QualifiedType(new PointerType(
new QualifiedType(new TagType(specializedMethod.Namespace))));
thisParameter.Name = "@this";
thisParameter.Name = "this";
thisParameter.Kind = ParameterKind.Extension;
thisParameter.Namespace = extensionMethod;
extensionMethod.Parameters.Insert(0, thisParameter);

Loading…
Cancel
Save