Browse Source

Refactor the diagnostics system.

pull/750/head
Joao Matos 9 years ago
parent
commit
fbf43067d7
  1. 52
      src/Core/Diagnostics.cs
  2. 2
      src/Generator.Tests/AST/TestAST.cs
  3. 2
      src/Generator.Tests/ASTTestFixture.cs
  4. 6
      src/Generator.Tests/GeneratorTest.cs
  5. 2
      src/Generator.Tests/ReadNativeDependenciesTest.cs
  6. 6
      src/Generator/BindingContext.cs
  7. 22
      src/Generator/Driver.cs
  8. 1
      src/Generator/Generators/Template.cs
  9. 13
      src/Generator/Passes/CheckDuplicatedNamesPass.cs
  10. 6
      src/Generator/Passes/GetterSetterToPropertyPass.cs
  11. 1
      src/Generator/Passes/Pass.cs

52
src/Core/Diagnostics.cs

@ -36,10 +36,27 @@ namespace CppSharp
void PopIndent(); void PopIndent();
} }
public static class DiagnosticExtensions public static class Diagnostics
{ {
public static void Debug(this IDiagnostics consumer, public static IDiagnostics Implementation { get; set; } = new ConsoleDiagnostics();
string msg, params object[] args)
public static DiagnosticKind Level
{
get { return Implementation.Level; }
set { Implementation.Level = value; }
}
public static void PushIndent(int level = 4)
{
Implementation.PushIndent(level);
}
public static void PopIndent()
{
Implementation.PopIndent();
}
public static void Debug(string msg, params object[] args)
{ {
var diagInfo = new DiagnosticInfo var diagInfo = new DiagnosticInfo
{ {
@ -47,11 +64,10 @@ namespace CppSharp
Message = string.Format(msg, args) Message = string.Format(msg, args)
}; };
consumer.Emit(diagInfo); Implementation.Emit(diagInfo);
} }
public static void Message(this IDiagnostics consumer, public static void Message(string msg, params object[] args)
string msg, params object[] args)
{ {
var diagInfo = new DiagnosticInfo var diagInfo = new DiagnosticInfo
{ {
@ -59,11 +75,10 @@ namespace CppSharp
Message = string.Format(msg, args) Message = string.Format(msg, args)
}; };
consumer.Emit(diagInfo); Implementation.Emit(diagInfo);
} }
public static void Warning(this IDiagnostics consumer, public static void Warning(string msg, params object[] args)
string msg, params object[] args)
{ {
var diagInfo = new DiagnosticInfo var diagInfo = new DiagnosticInfo
{ {
@ -71,11 +86,10 @@ namespace CppSharp
Message = string.Format(msg, args) Message = string.Format(msg, args)
}; };
consumer.Emit(diagInfo); Implementation.Emit(diagInfo);
} }
public static void Error(this IDiagnostics consumer, public static void Error(string msg, params object[] args)
string msg, params object[] args)
{ {
var diagInfo = new DiagnosticInfo var diagInfo = new DiagnosticInfo
{ {
@ -83,19 +97,7 @@ namespace CppSharp
Message = string.Format(msg, args) Message = string.Format(msg, args)
}; };
consumer.Emit(diagInfo); Implementation.Emit(diagInfo);
}
public static void Error(this IDiagnostics consumer,
string msg)
{
var diagInfo = new DiagnosticInfo
{
Kind = DiagnosticKind.Error,
Message = msg
};
consumer.Emit(diagInfo);
} }
} }

2
src/Generator.Tests/AST/TestAST.cs

@ -315,7 +315,7 @@ namespace CppSharp.Generator.Tests.AST
[Test] [Test]
public void TestAmbiguity() public void TestAmbiguity()
{ {
var bindingContext = new BindingContext(new ConsoleDiagnostics(), new DriverOptions(), var bindingContext = new BindingContext(new DriverOptions(),
new ParserOptions()); new ParserOptions());
new CleanUnitPass { Context = bindingContext }.VisitASTContext(AstContext); new CleanUnitPass { Context = bindingContext }.VisitASTContext(AstContext);
new CheckAmbiguousFunctions { Context = bindingContext }.VisitASTContext(AstContext); new CheckAmbiguousFunctions { Context = bindingContext }.VisitASTContext(AstContext);

2
src/Generator.Tests/ASTTestFixture.cs

@ -22,7 +22,7 @@ namespace CppSharp.Generator.Tests
Options.Headers.AddRange(files); Options.Headers.AddRange(files);
Driver = new Driver(Options, new ConsoleDiagnostics()) Driver = new Driver(Options)
{ {
ParserOptions = this.ParserOptions ParserOptions = this.ParserOptions
}; };

6
src/Generator.Tests/GeneratorTest.cs

@ -32,8 +32,8 @@ namespace CppSharp.Utils
options.Quiet = true; options.Quiet = true;
options.IgnoreParseWarnings = true; options.IgnoreParseWarnings = true;
driver.Diagnostics.Message(""); Diagnostics.Message("");
driver.Diagnostics.Message("Generating bindings for {0} ({1})", Diagnostics.Message("Generating bindings for {0} ({1})",
options.LibraryName, options.GeneratorKind.ToString()); options.LibraryName, options.GeneratorKind.ToString());
// Workaround for CLR which does not check for .dll if the // Workaround for CLR which does not check for .dll if the
@ -48,7 +48,7 @@ namespace CppSharp.Utils
var path = Path.GetFullPath(GetTestsDirectory(name)); var path = Path.GetFullPath(GetTestsDirectory(name));
parserOptions.AddIncludeDirs(path); parserOptions.AddIncludeDirs(path);
driver.Diagnostics.Message("Looking for tests in: {0}", path); Diagnostics.Message("Looking for tests in: {0}", path);
var files = Directory.EnumerateFiles(path, "*.h"); var files = Directory.EnumerateFiles(path, "*.h");
foreach (var file in files) foreach (var file in files)
options.Headers.Add(Path.GetFileName(file)); options.Headers.Add(Path.GetFileName(file));

2
src/Generator.Tests/ReadNativeDependenciesTest.cs

@ -42,7 +42,7 @@ namespace CppSharp.Generator.Tests
parserOptions.AddLibraryDirs(GeneratorTest.GetTestsDirectory("Native")); parserOptions.AddLibraryDirs(GeneratorTest.GetTestsDirectory("Native"));
var driverOptions = new DriverOptions(); var driverOptions = new DriverOptions();
driverOptions.Libraries.Add(library); driverOptions.Libraries.Add(library);
var driver = new Driver(driverOptions, new ConsoleDiagnostics()) var driver = new Driver(driverOptions)
{ {
ParserOptions = parserOptions ParserOptions = parserOptions
}; };

6
src/Generator/BindingContext.cs

@ -8,8 +8,6 @@ namespace CppSharp.Generators
{ {
public class BindingContext public class BindingContext
{ {
public IDiagnostics Diagnostics { get; set; }
public DriverOptions Options { get; private set; } public DriverOptions Options { get; private set; }
public ParserOptions ParserOptions { get; set; } public ParserOptions ParserOptions { get; set; }
@ -24,11 +22,9 @@ namespace CppSharp.Generators
public Dictionary<Function, DelegatesPass.DelegateDefinition> Delegates { get; private set; } public Dictionary<Function, DelegatesPass.DelegateDefinition> Delegates { get; private set; }
public BindingContext(IDiagnostics diagnostics, DriverOptions options, public BindingContext(DriverOptions options, ParserOptions parserOptions = null)
ParserOptions parserOptions = null)
{ {
Options = options; Options = options;
Diagnostics = diagnostics;
ParserOptions = parserOptions; ParserOptions = parserOptions;
Symbols = new SymbolContext(); Symbols = new SymbolContext();

22
src/Generator/Driver.cs

@ -20,7 +20,6 @@ namespace CppSharp
{ {
public class Driver public class Driver
{ {
public IDiagnostics Diagnostics { get; private set; }
public DriverOptions Options { get; private set; } public DriverOptions Options { get; private set; }
public ParserOptions ParserOptions { get; set; } public ParserOptions ParserOptions { get; set; }
public Project Project { get; private set; } public Project Project { get; private set; }
@ -29,10 +28,9 @@ namespace CppSharp
public bool HasCompilationErrors { get; set; } public bool HasCompilationErrors { get; set; }
public Driver(DriverOptions options, IDiagnostics diagnostics) public Driver(DriverOptions options)
{ {
Options = options; Options = options;
Diagnostics = diagnostics;
Project = new Project(); Project = new Project();
ParserOptions = new ParserOptions(); ParserOptions = new ParserOptions();
} }
@ -70,7 +68,7 @@ namespace CppSharp
{ {
ValidateOptions(); ValidateOptions();
ParserOptions.SetupIncludes(); ParserOptions.SetupIncludes();
Context = new BindingContext(Diagnostics, Options, ParserOptions); Context = new BindingContext(Options, ParserOptions);
Generator = CreateGeneratorFromKind(Options.GeneratorKind); Generator = CreateGeneratorFromKind(Options.GeneratorKind);
} }
@ -473,31 +471,29 @@ namespace CppSharp
public static void Run(ILibrary library) public static void Run(ILibrary library)
{ {
var options = new DriverOptions(); var options = new DriverOptions();
var driver = new Driver(options);
var Log = new ConsoleDiagnostics();
var driver = new Driver(options, Log);
library.Setup(driver); library.Setup(driver);
driver.Setup(); driver.Setup();
if(driver.ParserOptions.Verbose) if(driver.ParserOptions.Verbose)
Log.Level = DiagnosticKind.Debug; Diagnostics.Level = DiagnosticKind.Debug;
if (!options.Quiet) if (!options.Quiet)
Log.Message("Parsing libraries..."); Diagnostics.Message("Parsing libraries...");
if (!driver.ParseLibraries()) if (!driver.ParseLibraries())
return; return;
if (!options.Quiet) if (!options.Quiet)
Log.Message("Parsing code..."); Diagnostics.Message("Parsing code...");
driver.BuildParseOptions(); driver.BuildParseOptions();
if (!driver.ParseCode()) if (!driver.ParseCode())
{ {
Log.Error("CppSharp has encountered an error while parsing code."); Diagnostics.Error("CppSharp has encountered an error while parsing code.");
return; return;
} }
@ -505,7 +501,7 @@ namespace CppSharp
options.Modules.RemoveAll(m => m != options.SystemModule && !m.Units.GetGenerated().Any()); options.Modules.RemoveAll(m => m != options.SystemModule && !m.Units.GetGenerated().Any());
if (!options.Quiet) if (!options.Quiet)
Log.Message("Processing code..."); Diagnostics.Message("Processing code...");
library.Preprocess(driver, driver.Context.ASTContext); library.Preprocess(driver, driver.Context.ASTContext);
@ -515,7 +511,7 @@ namespace CppSharp
library.Postprocess(driver, driver.Context.ASTContext); library.Postprocess(driver, driver.Context.ASTContext);
if (!options.Quiet) if (!options.Quiet)
Log.Message("Generating code..."); Diagnostics.Message("Generating code...");
var outputs = driver.GenerateCode(); var outputs = driver.GenerateCode();

1
src/Generator/Generators/Template.cs

@ -7,7 +7,6 @@ namespace CppSharp.Generators
{ {
public BindingContext Context { get; private set; } public BindingContext Context { get; private set; }
public IDiagnostics Log { get { return Context.Diagnostics; } }
public DriverOptions Options { get { return Context.Options; } } public DriverOptions Options { get { return Context.Options; } }
public List<TranslationUnit> TranslationUnits { get; private set; } public List<TranslationUnit> TranslationUnits { get; private set; }

13
src/Generator/Passes/CheckDuplicatedNamesPass.cs

@ -1,5 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using CppSharp.AST; using CppSharp.AST;
@ -11,11 +10,9 @@ namespace CppSharp.Passes
{ {
private readonly Dictionary<string, int> methodSignatures; private readonly Dictionary<string, int> methodSignatures;
private int Count; private int Count;
private readonly IDiagnostics diagnostics;
public DeclarationName(IDiagnostics diagnostics) public DeclarationName()
{ {
this.diagnostics = diagnostics;
methodSignatures = new Dictionary<string, int>(); methodSignatures = new Dictionary<string, int>();
} }
@ -77,12 +74,12 @@ namespace CppSharp.Passes
{ {
// TODO: turn into a method; append the original type (say, "signed long") // TODO: turn into a method; append the original type (say, "signed long")
// of the last parameter to the type so that the user knows which overload is called // of the last parameter to the type so that the user knows which overload is called
diagnostics.Warning("Duplicate operator {0} ignored", function.Name); Diagnostics.Warning("Duplicate operator {0} ignored", function.Name);
function.ExplicitlyIgnore(); function.ExplicitlyIgnore();
} }
else if (method != null && method.IsConstructor) else if (method != null && method.IsConstructor)
{ {
diagnostics.Warning("Duplicate constructor {0} ignored", function.Name); Diagnostics.Warning("Duplicate constructor {0} ignored", function.Name);
function.ExplicitlyIgnore(); function.ExplicitlyIgnore();
} }
else else
@ -221,7 +218,7 @@ namespace CppSharp.Passes
// If the name is not yet on the map, then add it. // If the name is not yet on the map, then add it.
if (!names.ContainsKey(fullName)) if (!names.ContainsKey(fullName))
names.Add(fullName, new DeclarationName(Diagnostics)); names.Add(fullName, new DeclarationName());
if (names[fullName].UpdateName(decl)) if (names[fullName].UpdateName(decl))
{ {

6
src/Generator/Passes/GetterSetterToPropertyPass.cs

@ -15,15 +15,13 @@ namespace CppSharp.Passes
{ {
private class PropertyGenerator private class PropertyGenerator
{ {
private readonly IDiagnostics Diagnostics;
private readonly List<Method> getters = new List<Method>(); private readonly List<Method> getters = new List<Method>();
private readonly List<Method> setters = new List<Method>(); private readonly List<Method> setters = new List<Method>();
private readonly List<Method> setMethods = new List<Method>(); private readonly List<Method> setMethods = new List<Method>();
private readonly List<Method> nonSetters = new List<Method>(); private readonly List<Method> nonSetters = new List<Method>();
public PropertyGenerator(Class @class, IDiagnostics diags) public PropertyGenerator(Class @class)
{ {
Diagnostics = diags;
foreach (var method in @class.Methods.Where( foreach (var method in @class.Methods.Where(
m => !m.IsConstructor && !m.IsDestructor && !m.IsOperator && m.IsGenerated)) m => !m.IsConstructor && !m.IsDestructor && !m.IsOperator && m.IsGenerated))
DistributeMethod(method); DistributeMethod(method);
@ -354,7 +352,7 @@ namespace CppSharp.Passes
if (baseClass.IsClass) if (baseClass.IsClass)
VisitClassDecl(baseClass.Class); VisitClassDecl(baseClass.Class);
new PropertyGenerator(@class, Diagnostics).GenerateProperties(); new PropertyGenerator(@class).GenerateProperties();
} }
return false; return false;
} }

1
src/Generator/Passes/Pass.cs

@ -12,7 +12,6 @@ namespace CppSharp.Passes
{ {
public BindingContext Context { get; set; } public BindingContext Context { get; set; }
public IDiagnostics Diagnostics { get { return Context.Diagnostics; } }
public DriverOptions Options { get { return Context.Options; } } public DriverOptions Options { get { return Context.Options; } }
public ASTContext ASTContext { get { return Context.ASTContext; } } public ASTContext ASTContext { get { return Context.ASTContext; } }
public TypeMapDatabase TypeMaps { get { return Context.TypeMaps; } } public TypeMapDatabase TypeMaps { get { return Context.TypeMaps; } }

Loading…
Cancel
Save