Browse Source

Simplify parser API.

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
087aee7fe8
  1. 10
      ICSharpCode.NRefactory.CSharp/Ast/SyntaxTree.cs
  2. 12
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  3. 15
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs
  4. 124
      ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs
  5. 9
      ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs
  6. 3
      ICSharpCode.NRefactory.CSharp/Parser/mcs/driver.cs
  7. 2
      ICSharpCode.NRefactory.ConsistencyCheck/CSharpProject.cs
  8. 3
      ICSharpCode.NRefactory.Demo/CSDemo.cs
  9. 6
      ICSharpCode.NRefactory.Tests/CSharp/Analysis/DefiniteAssignmentTests.cs
  10. 8
      ICSharpCode.NRefactory.Tests/CSharp/CodeDomConvertVisitorTests.cs
  11. 4
      ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/AttributeSectionTests.cs
  12. 2
      ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/NamespaceDeclarationTests.cs
  13. 8
      ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/UsingDeclarationTests.cs
  14. 2
      ICSharpCode.NRefactory.Tests/CSharp/Parser/ParseSelfTests.cs
  15. 8
      ICSharpCode.NRefactory.Tests/CSharp/Parser/ParseUtil.cs
  16. 2
      ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeMembers/PropertyDeclarationTests.cs
  17. 2
      ICSharpCode.NRefactory.Tests/CSharp/Refactoring/TypeSystemAstBuilderTests.cs
  18. 41
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/ExplicitConversionsTest.cs
  19. 2
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/FindReferencesTest.cs
  20. 2
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs
  21. 4
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolverTestBase.cs
  22. 2
      ICSharpCode.NRefactory.Tests/Documentation/CSharpCrefLookupTests.cs
  23. 2
      ICSharpCode.NRefactory.Tests/Documentation/CSharpDocumentationTests.cs
  24. 2
      ICSharpCode.NRefactory.Tests/Documentation/IDStringTests.cs
  25. 4
      ICSharpCode.NRefactory/IAnnotatable.cs

10
ICSharpCode.NRefactory.CSharp/Ast/SyntaxTree.cs

@ -155,28 +155,28 @@ namespace ICSharpCode.NRefactory.CSharp @@ -155,28 +155,28 @@ namespace ICSharpCode.NRefactory.CSharp
return v.ParsedFile;
}
public static SyntaxTree Parse (string text, string fileName = "", CompilerSettings settings = null, CancellationToken cancellationToken = default (CancellationToken))
public static SyntaxTree Parse (string program, string fileName = "", CompilerSettings settings = null, CancellationToken cancellationToken = default (CancellationToken))
{
var parser = new CSharpParser (settings);
return parser.Parse (text, fileName);
return parser.Parse (program, fileName);
}
public static SyntaxTree Parse (TextReader reader, string fileName = "", CompilerSettings settings = null, CancellationToken cancellationToken = default (CancellationToken))
{
var parser = new CSharpParser (settings);
return parser.Parse (reader, fileName, 0);
return parser.Parse (reader, fileName);
}
public static SyntaxTree Parse (Stream stream, string fileName = "", CompilerSettings settings = null, CancellationToken cancellationToken = default (CancellationToken))
{
var parser = new CSharpParser (settings);
return parser.Parse (stream, fileName, 0);
return parser.Parse (stream, fileName);
}
public static SyntaxTree Parse (ITextSource textSource, string fileName = "", CompilerSettings settings = null, CancellationToken cancellationToken = default (CancellationToken))
{
var parser = new CSharpParser (settings);
return parser.Parse (textSource, fileName, 0);
return parser.Parse (textSource, fileName);
}
}
}

12
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs

@ -2751,9 +2751,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2751,9 +2751,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var sb = new StringBuilder(text);
sb.Append("a;");
AppendMissingClosingBrackets(sb, text, false);
var stream = new System.IO.StringReader(sb.ToString());
var completionUnit = parser.Parse(stream, "a.cs", 0);
stream.Close();
var completionUnit = parser.Parse(sb.ToString());
var loc = document.GetLocation(offset);
var expr = completionUnit.GetNodeAt(
@ -2774,9 +2772,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2774,9 +2772,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
sb.Append("a ();");
AppendMissingClosingBrackets(sb, text, false);
var stream = new System.IO.StringReader(sb.ToString());
var completionUnit = parser.Parse(stream, "a.cs", 0);
stream.Close();
var completionUnit = parser.Parse(sb.ToString());
var loc = document.GetLocation(offset);
var expr = completionUnit.GetNodeAt(loc, n => n is Expression);
@ -2785,9 +2781,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2785,9 +2781,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
sb = new StringBuilder(text);
sb.Append("a ()");
AppendMissingClosingBrackets(sb, text, false);
stream = new System.IO.StringReader(sb.ToString());
completionUnit = parser.Parse(stream, "a.cs", 0);
stream.Close();
completionUnit = parser.Parse(sb.ToString());
loc = document.GetLocation(offset);
expr = completionUnit.GetNodeAt(loc, n => n is Expression);

15
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs

@ -681,17 +681,10 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -681,17 +681,10 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (closingBrackets > 0) {
wrapper.Append(new string('}', closingBrackets));
}
using (var stream = new System.IO.StringReader (wrapper.ToString ())) {
try {
var parser = new CSharpParser ();
var result = parser.Parse(stream, "stub.cs", memberLocation.Line - 1 - generatedLines);
return result;
} catch (Exception) {
Console.WriteLine("------");
Console.WriteLine(wrapper);
throw;
}
}
var parser = new CSharpParser ();
parser.InitialLocation = new TextLocation(memberLocation.Line - generatedLines, 1);
var result = parser.Parse(wrapper.ToString ());
return result;
}
// string cachedText = null;

124
ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs

@ -3709,12 +3709,34 @@ namespace ICSharpCode.NRefactory.CSharp @@ -3709,12 +3709,34 @@ namespace ICSharpCode.NRefactory.CSharp
get { return errorReportPrinter.Errors; }
}
public SyntaxTree Parse (TextReader reader, string fileName, int lineModifier = 0)
/// <summary>
/// Parses a C# code file.
/// </summary>
/// <param name="program">The source code to parse.</param>
/// <param name="fileName">The file name. Used to identify the file (e.g. when building a type system).
/// This can be an arbitrary identifier, NRefactory never tries to access the file on disk.</param>
/// <returns>Returns the syntax tree.</returns>
public SyntaxTree Parse (string program, string fileName = "")
{
return Parse(new StringTextSource (reader.ReadToEnd ()), fileName, lineModifier);
return Parse (new StringTextSource (program), fileName);
}
/// <summary>
/// Parses a C# code file.
/// </summary>
/// <param name="reader">The text reader containing the source code to parse.</param>
/// <param name="fileName">The file name. Used to identify the file (e.g. when building a type system).
/// This can be an arbitrary identifier, NRefactory never tries to access the file on disk.</param>
/// <returns>Returns the syntax tree.</returns>
public SyntaxTree Parse (TextReader reader, string fileName = "")
{
return Parse(new StringTextSource (reader.ReadToEnd ()), fileName);
}
public SyntaxTree Parse(CompilerCompilationUnit top, string fileName, int lineModifier = 0)
/// <summary>
/// Converts a Mono.CSharp syntax tree into an NRefactory syntax tree.
/// </summary>
public SyntaxTree Parse(CompilerCompilationUnit top, string fileName)
{
if (top == null) {
return null;
@ -3743,59 +3765,101 @@ namespace ICSharpCode.NRefactory.CSharp @@ -3743,59 +3765,101 @@ namespace ICSharpCode.NRefactory.CSharp
}
}
/// <summary>
/// Callback that gets called with the Mono.CSharp syntax tree whenever some code is parsed.
/// </summary>
public Action<CompilerCompilationUnit> CompilationUnitCallback {
get;
set;
}
/// <summary>
/// Specifies whether to run the parser in a special mode for generating the type system.
/// If this property is true, the syntax tree will only contain nodes relevant for the
/// <see cref="SyntaxTree.ToTypeSystem()"/> call and might be missing other nodes (e.g. method bodies).
/// The default is false.
/// </summary>
public bool GenerateTypeSystemMode {
get;
set;
}
public SyntaxTree Parse (string program, string fileName)
{
return Parse (new StringTextSource (program), fileName);
TextLocation initialLocation = new TextLocation(1, 1);
/// <summary>
/// Specifies the text location where parsing starts.
/// This property can be used when parsing a part of a file to make the locations of the AstNodes
/// refer to the position in the whole file.
/// The default is (1,1).
/// </summary>
public TextLocation InitialLocation {
get { return initialLocation; }
set { initialLocation = value; }
}
internal static object parseLock = new object ();
public SyntaxTree Parse (Stream stream, string fileName, int lineModifier = 0)
/// <summary>
/// Parses a C# code file.
/// </summary>
/// <param name="stream">The stream containing the source code to parse.</param>
/// <param name="fileName">The file name. Used to identify the file (e.g. when building a type system).
/// This can be an arbitrary identifier, NRefactory never tries to access the file on disk.</param>
/// <returns>Returns the syntax tree.</returns>
public SyntaxTree Parse (Stream stream, string fileName = "")
{
return Parse (new StreamReader (stream), fileName, lineModifier);
return Parse (new StreamReader (stream), fileName);
}
public SyntaxTree Parse(ITextSource src, string fileName, int lineModifier = 0)
/// <summary>
/// Parses a C# code file.
/// </summary>
/// <param name="program">The source code to parse.</param>
/// <param name="fileName">The file name. Used to identify the file (e.g. when building a type system).
/// This can be an arbitrary identifier, NRefactory never tries to access the file on disk.</param>
/// </param>
/// <returns>Returns the syntax tree.</returns>
public SyntaxTree Parse(ITextSource program, string fileName = "")
{
return Parse(program, fileName, initialLocation.Line, initialLocation.Column);
}
SyntaxTree Parse(ITextSource program, string fileName, int initialLine, int initialColumn)
{
lock (parseLock) {
errorReportPrinter = new ErrorReportPrinter ("");
var ctx = new CompilerContext (compilerSettings.ToMono(), errorReportPrinter);
ctx.Settings.TabSize = 1;
var reader = new SeekableStreamReader (src);
var reader = new SeekableStreamReader (program);
var file = new SourceFile (fileName, fileName, 0);
Location.Initialize (new List<SourceFile> (new [] { file }));
var module = new ModuleContainer (ctx);
var session = new ParserSession ();
session.LocationsBag = new LocationsBag ();
var report = new Report (ctx, errorReportPrinter);
var parser = Driver.Parse (reader, file, module, session, report, lineModifier);
var parser = Driver.Parse (reader, file, module, session, report, initialLine - 1, initialColumn - 1);
var top = new CompilerCompilationUnit () {
ModuleCompiled = module,
LocationsBag = session.LocationsBag,
SpecialsBag = parser.Lexer.sbag,
Conditionals = parser.Lexer.SourceFile.Conditionals
};
var unit = Parse (top, fileName, lineModifier);
var unit = Parse (top, fileName);
unit.Errors.AddRange (errorReportPrinter.Errors);
CompilerCallableEntryPoint.Reset ();
return unit;
}
}
public IEnumerable<EntityDeclaration> ParseTypeMembers (TextReader reader, int lineModifier = 0)
public IEnumerable<EntityDeclaration> ParseTypeMembers (string code)
{
return ParseTypeMembers(code, initialLocation.Line, initialLocation.Column);
}
IEnumerable<EntityDeclaration> ParseTypeMembers (string code, int initialLine, int initialColumn)
{
string code = "unsafe partial class MyClass { " + Environment.NewLine + reader.ReadToEnd () + "}";
var syntaxTree = Parse (new StringReader (code), "parsed.cs", lineModifier - 1);
const string prefix = "unsafe partial class MyClass { ";
var syntaxTree = Parse (new StringTextSource (prefix + code + "}"), "parsed.cs", initialLine, initialColumn - prefix.Length);
if (syntaxTree == null)
return Enumerable.Empty<EntityDeclaration> ();
var td = syntaxTree.FirstChild as TypeDeclaration;
@ -3809,11 +3873,16 @@ namespace ICSharpCode.NRefactory.CSharp @@ -3809,11 +3873,16 @@ namespace ICSharpCode.NRefactory.CSharp
return Enumerable.Empty<EntityDeclaration> ();
}
public IEnumerable<Statement> ParseStatements (TextReader reader, int lineModifier = 0)
public IEnumerable<Statement> ParseStatements (string code)
{
return ParseStatements(code, initialLocation.Line, initialLocation.Column);
}
IEnumerable<Statement> ParseStatements (string code, int initialLine, int initialColumn)
{
// the dummy method is async so that 'await' expressions are parsed as expected
string code = "async void M() { " + Environment.NewLine + reader.ReadToEnd () + "}";
var members = ParseTypeMembers (new StringReader (code), lineModifier - 1);
const string prefix = "async void M() { ";
var members = ParseTypeMembers (prefix + code + "}", initialLine, initialColumn - prefix.Length);
var method = members.FirstOrDefault () as MethodDeclaration;
if (method != null && method.Body != null) {
var statements = method.Body.Statements.ToArray();
@ -3825,10 +3894,9 @@ namespace ICSharpCode.NRefactory.CSharp @@ -3825,10 +3894,9 @@ namespace ICSharpCode.NRefactory.CSharp
return Enumerable.Empty<Statement> ();
}
public AstType ParseTypeReference (TextReader reader)
public AstType ParseTypeReference (string code)
{
string code = reader.ReadToEnd () + " a;";
var members = ParseTypeMembers (new StringReader (code));
var members = ParseTypeMembers (code + " a;");
var field = members.FirstOrDefault () as FieldDeclaration;
if (field != null) {
AstType type = field.ReturnType;
@ -3838,9 +3906,11 @@ namespace ICSharpCode.NRefactory.CSharp @@ -3838,9 +3906,11 @@ namespace ICSharpCode.NRefactory.CSharp
return AstType.Null;
}
public Expression ParseExpression (TextReader reader)
public Expression ParseExpression (string code)
{
var es = ParseStatements (new StringReader ("tmp = " + Environment.NewLine + reader.ReadToEnd () + ";"), -1).FirstOrDefault () as ExpressionStatement;
const string prefix = "tmp = ";
var statements = ParseStatements (prefix + code + ";", initialLocation.Line, initialLocation.Column - prefix.Length);
var es = statements.FirstOrDefault () as ExpressionStatement;
if (es != null) {
AssignmentExpression ae = es.Expression as AssignmentExpression;
if (ae != null) {
@ -3852,14 +3922,16 @@ namespace ICSharpCode.NRefactory.CSharp @@ -3852,14 +3922,16 @@ namespace ICSharpCode.NRefactory.CSharp
return Expression.Null;
}
/*
/// <summary>
/// Parses a file snippet; guessing what the code snippet represents (whole file, type members, block, type reference, expression).
/// </summary>
public AstNode ParseSnippet (TextReader reader)
public AstNode ParseSnippet (string code)
{
// TODO: add support for parsing a part of a file
throw new NotImplementedException ();
}
*/
public DocumentationReference ParseDocumentationReference (string cref)
{
@ -3884,6 +3956,8 @@ namespace ICSharpCode.NRefactory.CSharp @@ -3884,6 +3956,8 @@ namespace ICSharpCode.NRefactory.CSharp
ParserSession session = new ParserSession ();
session.LocationsBag = new LocationsBag ();
var parser = new Mono.CSharp.CSharpParser (reader, source_file, report, session);
parser.Lexer.Line += initialLocation.Line - 1;
parser.Lexer.Column += initialLocation.Column - 1;
parser.Lexer.putback_char = Tokenizer.DocumentationXref;
parser.Lexer.parsing_generic_declaration_doc = true;
parser.parse ();

9
ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs

@ -386,6 +386,15 @@ namespace Mono.CSharp @@ -386,6 +386,15 @@ namespace Mono.CSharp
}
}
public int Column {
get {
return col;
}
set {
col = value;
}
}
//
// This is used when the tokenizer needs to save
// the current position as it needs to do some parsing

3
ICSharpCode.NRefactory.CSharp/Parser/mcs/driver.cs

@ -161,13 +161,14 @@ namespace Mono.CSharp @@ -161,13 +161,14 @@ namespace Mono.CSharp
input.Close ();
}
public static CSharpParser Parse (SeekableStreamReader reader, SourceFile sourceFile, ModuleContainer module, ParserSession session, Report report, int lineModifier = 0)
public static CSharpParser Parse (SeekableStreamReader reader, SourceFile sourceFile, ModuleContainer module, ParserSession session, Report report, int lineModifier = 0, int colModifier = 0)
{
var file = new CompilationSourceFile (module, sourceFile);
module.AddTypeContainer(file);
CSharpParser parser = new CSharpParser (reader, file, report, session);
parser.Lexer.Line += lineModifier;
parser.Lexer.Column += colModifier;
parser.Lexer.sbag = new SpecialsBag ();
parser.parse ();
return parser;

2
ICSharpCode.NRefactory.ConsistencyCheck/CSharpProject.cs

@ -169,7 +169,7 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck @@ -169,7 +169,7 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
this.LinesOfCode = 1 + this.Content.Text.Count(c => c == '\n');
CSharpParser p = new CSharpParser(project.CompilerSettings);
this.SyntaxTree = p.Parse(Content.CreateReader(), fileName);
this.SyntaxTree = p.Parse(Content, fileName);
if (p.HasErrors) {
Console.WriteLine("Error parsing " + fileName + ":");
foreach (var error in p.ErrorsAndWarnings) {

3
ICSharpCode.NRefactory.Demo/CSDemo.cs

@ -65,8 +65,7 @@ namespace ICSharpCode.NRefactory.Demo @@ -65,8 +65,7 @@ namespace ICSharpCode.NRefactory.Demo
void CSharpParseButtonClick(object sender, EventArgs e)
{
CSharpParser parser = new CSharpParser();
syntaxTree = parser.Parse(new StringReader(csharpCodeTextBox.Text), "dummy.cs");
syntaxTree = SyntaxTree.Parse(csharpCodeTextBox.Text);
csharpTreeView.Nodes.Clear();
foreach (var element in syntaxTree.Children) {
csharpTreeView.Nodes.Add(MakeTreeNode(element));

6
ICSharpCode.NRefactory.Tests/CSharp/Analysis/DefiniteAssignmentTests.cs

@ -295,7 +295,7 @@ namespace ICSharpCode.NRefactory.CSharp.Analysis @@ -295,7 +295,7 @@ namespace ICSharpCode.NRefactory.CSharp.Analysis
{
string code = "int a; int b = X ? (a = 1) : 0;";
var block = new BlockStatement();
block.Statements.AddRange(new CSharpParser().ParseStatements(new StringReader(code)));
block.Statements.AddRange(new CSharpParser().ParseStatements(code));
DefiniteAssignmentAnalysis da = CreateDefiniteAssignmentAnalysis(block);
da.Analyze("a");
@ -307,7 +307,7 @@ namespace ICSharpCode.NRefactory.CSharp.Analysis @@ -307,7 +307,7 @@ namespace ICSharpCode.NRefactory.CSharp.Analysis
{
string code = "int a; int b = X ? (a = 1) : (a = 2);";
var block = new BlockStatement();
block.Statements.AddRange(new CSharpParser().ParseStatements(new StringReader(code)));
block.Statements.AddRange(new CSharpParser().ParseStatements(code));
DefiniteAssignmentAnalysis da = CreateDefiniteAssignmentAnalysis(block);
da.Analyze("a");
@ -319,7 +319,7 @@ namespace ICSharpCode.NRefactory.CSharp.Analysis @@ -319,7 +319,7 @@ namespace ICSharpCode.NRefactory.CSharp.Analysis
{
string code = "int a; int b = true ? (a = 1) : 0;";
var block = new BlockStatement();
block.Statements.AddRange(new CSharpParser().ParseStatements(new StringReader(code)));
block.Statements.AddRange(new CSharpParser().ParseStatements(code));
DefiniteAssignmentAnalysis da = CreateDefiniteAssignmentAnalysis(block);
da.Analyze("a");

8
ICSharpCode.NRefactory.Tests/CSharp/CodeDomConvertVisitorTests.cs

@ -71,7 +71,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -71,7 +71,7 @@ namespace ICSharpCode.NRefactory.CSharp
string ConvertExpression(string code)
{
CSharpParser parser = new CSharpParser();
var expr = parser.ParseExpression(new StringReader(code));
var expr = parser.ParseExpression(code);
Assert.IsFalse(parser.HasErrors);
return ConvertExpression(expr);
}
@ -84,7 +84,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -84,7 +84,7 @@ namespace ICSharpCode.NRefactory.CSharp
string ConvertStatement(string code)
{
CSharpParser parser = new CSharpParser();
var expr = parser.ParseStatements(new StringReader(code)).Single();
var expr = parser.ParseStatements(code).Single();
Assert.IsFalse(parser.HasErrors);
return ConvertStatement(expr);
}
@ -97,7 +97,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -97,7 +97,7 @@ namespace ICSharpCode.NRefactory.CSharp
string ConvertMember(string code)
{
CSharpParser parser = new CSharpParser();
var expr = parser.ParseTypeMembers(new StringReader(code)).Single();
var expr = parser.ParseTypeMembers(code).Single();
Assert.IsFalse(parser.HasErrors);
return ConvertMember(expr);
}
@ -110,7 +110,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -110,7 +110,7 @@ namespace ICSharpCode.NRefactory.CSharp
string ConvertTypeDeclaration(string code)
{
CSharpParser parser = new CSharpParser();
var syntaxTree = parser.Parse(new StringReader(code), "program.cs");
var syntaxTree = parser.Parse(code, "program.cs");
Assert.IsFalse(parser.HasErrors);
return ConvertTypeDeclaration((EntityDeclaration)syntaxTree.Children.Single());
}

4
ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/AttributeSectionTests.cs

@ -197,7 +197,7 @@ public class Form1 { @@ -197,7 +197,7 @@ public class Form1 {
[Test]
public void AssemblyAttributeBeforeNamespace()
{
var syntaxTree = new CSharpParser().Parse(new StringReader("using System; [assembly: Attr] namespace X {}"), "code.cs");
var syntaxTree = SyntaxTree.Parse("using System; [assembly: Attr] namespace X {}");
Assert.AreEqual(
new Type[] {
typeof(UsingDeclaration),
@ -210,7 +210,7 @@ public class Form1 { @@ -210,7 +210,7 @@ public class Form1 {
[Test]
public void AssemblyAttributeBeforeClass()
{
var syntaxTree = new CSharpParser().Parse(new StringReader("using System; [assembly: Attr] class X {}"), "code.cs");
var syntaxTree = SyntaxTree.Parse("using System; [assembly: Attr] class X {}");
Assert.AreEqual(
new Type[] {
typeof(UsingDeclaration),

2
ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/NamespaceDeclarationTests.cs

@ -53,7 +53,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope @@ -53,7 +53,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope
public void ExternAliasTest()
{
string program = "extern alias X; extern alias Y; using X::System; namespace TestNamespace { extern alias Z; using Y::System; }";
var syntaxTree = new CSharpParser().Parse(new StringReader(program), "code.cs");
var syntaxTree = new CSharpParser().Parse(program, "code.cs");
Assert.AreEqual(
new Type[] {
typeof(ExternAliasDeclaration),

8
ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/UsingDeclarationTests.cs

@ -31,7 +31,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope @@ -31,7 +31,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope
{
string program = "using\n";
CSharpParser parser = new CSharpParser();
SyntaxTree syntaxTree = parser.Parse (program, "parsed.cs");
SyntaxTree syntaxTree = parser.Parse (program);
Assert.AreEqual(0, syntaxTree.Children.Count());
Assert.IsTrue(parser.HasErrors);
}
@ -42,7 +42,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope @@ -42,7 +42,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope
string program = "using System;\n" +
"using My.Name.Space;\n";
CSharpParser parser = new CSharpParser();
SyntaxTree syntaxTree = parser.Parse(new StringReader(program), "parsed.cs");
SyntaxTree syntaxTree = parser.Parse(program);
Assert.IsFalse(parser.HasErrors);
Assert.AreEqual(2, syntaxTree.Children.Count());
@ -64,7 +64,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope @@ -64,7 +64,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope
"using myAlias=My.Name.Space;\n" +
"using StringCollection = System.Collections.Generic.List<string>;\n";
CSharpParser parser = new CSharpParser();
SyntaxTree syntaxTree = parser.Parse(new StringReader(program), "parsed.cs");
SyntaxTree syntaxTree = parser.Parse(program);
Assert.IsFalse(parser.HasErrors);
Assert.AreEqual(3, syntaxTree.Children.Count());
@ -92,7 +92,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope @@ -92,7 +92,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope
"using myAlias=global::My.Name.Space;\n" +
"using a::b.c;\n";
CSharpParser parser = new CSharpParser();
SyntaxTree syntaxTree = parser.Parse(new StringReader(program), "parsed.cs");
SyntaxTree syntaxTree = parser.Parse(program);
Assert.IsFalse(parser.HasErrors);
Assert.AreEqual(3, syntaxTree.Children.Count());

2
ICSharpCode.NRefactory.Tests/CSharp/Parser/ParseSelfTests.cs

@ -76,7 +76,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser @@ -76,7 +76,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser
CSharpParser parser = new CSharpParser();
foreach (string fileName in fileNames) {
this.currentDocument = new ReadOnlyDocument(File.ReadAllText(fileName));
SyntaxTree syntaxTree = parser.Parse(currentDocument.CreateReader(), fileName);
SyntaxTree syntaxTree = parser.Parse(currentDocument, fileName);
if (parser.HasErrors)
continue;
this.currentFileName = fileName;

8
ICSharpCode.NRefactory.Tests/CSharp/Parser/ParseUtil.cs

@ -33,7 +33,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser @@ -33,7 +33,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser
public static T ParseGlobal<T>(string code, bool expectErrors = false) where T : AstNode
{
CSharpParser parser = new CSharpParser();
SyntaxTree syntaxTree = parser.Parse(new StringReader(code), "parsed.cs");
SyntaxTree syntaxTree = parser.Parse(code);
foreach (var error in parser.Errors)
Console.WriteLine (error.Message);
@ -56,7 +56,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser @@ -56,7 +56,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser
public static T ParseStatement<T>(string stmt, bool expectErrors = false) where T : AstNode
{
CSharpParser parser = new CSharpParser();
var statements = parser.ParseStatements(new StringReader(stmt));
var statements = parser.ParseStatements(stmt);
foreach (var error in parser.Errors)
Console.WriteLine (error.Message);
@ -79,7 +79,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser @@ -79,7 +79,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser
public static T ParseExpression<T>(string expr, bool expectErrors = false) where T : AstNode
{
CSharpParser parser = new CSharpParser();
AstNode parsedExpression = parser.ParseExpression(new StringReader(expr));
AstNode parsedExpression = parser.ParseExpression(expr);
foreach (var error in parser.Errors)
Console.WriteLine (error.Message);
@ -102,7 +102,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser @@ -102,7 +102,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser
public static T ParseTypeMember<T>(string expr, bool expectErrors = false) where T : EntityDeclaration
{
CSharpParser parser = new CSharpParser();
var members = parser.ParseTypeMembers(new StringReader(expr));
var members = parser.ParseTypeMembers(expr);
foreach (var error in parser.Errors)
Console.WriteLine (error.Message);
Assert.AreEqual(expectErrors, parser.HasErrors, "HasErrors");

2
ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeMembers/PropertyDeclarationTests.cs

@ -72,7 +72,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers @@ -72,7 +72,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers
int line4Pos = code.IndexOf("\t\tset");
CSharpParser parser = new CSharpParser();
SyntaxTree syntaxTree = parser.Parse(new StringReader(code), "parsed.cs");
SyntaxTree syntaxTree = parser.Parse(code);
PropertyDeclaration pd = (PropertyDeclaration)syntaxTree.Children.Single().GetChildByRole(Roles.TypeMemberRole);
Assert.AreEqual(new TextLocation(2, code.IndexOf("{\n\t\tget") - line2Pos + 1), pd.GetChildByRole(Roles.LBrace).StartLocation);
Assert.AreEqual(new TextLocation(5, 3), pd.EndLocation);

2
ICSharpCode.NRefactory.Tests/CSharp/Refactoring/TypeSystemAstBuilderTests.cs

@ -63,7 +63,7 @@ namespace OtherNS { @@ -63,7 +63,7 @@ namespace OtherNS {
{
pc = new CSharpProjectContent();
pc = pc.SetAssemblyName("MyAssembly");
parsedFile = new CSharpParser().Parse(new StringReader(program), "program.cs").ToTypeSystem();
parsedFile = SyntaxTree.Parse(program, "program.cs").ToTypeSystem();
pc = pc.UpdateProjectContent(null, parsedFile);
pc = pc.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib });

41
ICSharpCode.NRefactory.Tests/CSharp/Resolver/ExplicitConversionsTest.cs

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.Semantics;
@ -446,9 +447,49 @@ class C { @@ -446,9 +447,49 @@ class C {
C1 c1 = $(C1)c2$;
}
}");
Assert.IsTrue(rr.Conversion.IsValid);
Assert.IsTrue(rr.Conversion.IsUserDefined);
Assert.AreEqual("op_Explicit", rr.Conversion.Method.Name);
}
[Test]
public void ExplicitReferenceConversionFollowedByUserDefinedConversion()
{
var rr = Resolve<ConversionResolveResult>(@"
class B {}
class S : B {}
class T {
public static explicit operator T(S s) { return null; }
}
class Test {
void Run(B b) {
T t = $(T)b$;
}
}");
Assert.IsTrue(rr.Conversion.IsValid);
Assert.IsTrue(rr.Conversion.IsUserDefined);
Assert.AreEqual("B", rr.Input.Type.Name);
}
[Test]
[Ignore("Not implemented yet.")]
public void BothDirectConversionAndBaseClassConversionAvailable()
{
var rr = Resolve<ConversionResolveResult>(@"
class B {}
class S : B {}
class T {
public static explicit operator T(S s) { return null; }
public static explicit operator T(B b) { return null; }
}
class Test {
void Run(B b) {
T t = $(T)b$;
}
}");
Assert.IsTrue(rr.Conversion.IsValid);
Assert.IsTrue(rr.Conversion.IsUserDefined);
Assert.AreEqual("b", rr.Conversion.Method.Parameters.Single().Name);
}
}
}

2
ICSharpCode.NRefactory.Tests/CSharp/Resolver/FindReferencesTest.cs

@ -37,7 +37,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -37,7 +37,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
void Init(string code)
{
syntaxTree = new CSharpParser().Parse(new StringReader(code), "test.cs");
syntaxTree = SyntaxTree.Parse(code, "test.cs");
parsedFile = syntaxTree.ToTypeSystem();
compilation = TypeSystemHelper.CreateCompilation(parsedFile);
findReferences = new FindReferences();

2
ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs

@ -40,7 +40,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -40,7 +40,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
CSharpParsedFile Parse(string program)
{
SyntaxTree syntaxTree = new CSharpParser().Parse(new StringReader(program), "test.cs");
SyntaxTree syntaxTree = SyntaxTree.Parse(program, "test.cs");
CSharpParsedFile parsedFile = syntaxTree.ToTypeSystem();
project = project.UpdateProjectContent(null, parsedFile);
compilation = project.CreateCompilation();

4
ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolverTestBase.cs

@ -161,7 +161,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -161,7 +161,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
protected Tuple<CSharpAstResolver, AstNode> PrepareResolver(string code)
{
SyntaxTree syntaxTree = new CSharpParser().Parse(new StringReader(code.Replace("$", "")), "code.cs");
SyntaxTree syntaxTree = new CSharpParser().Parse(code.Replace("$", ""), "code.cs");
TextLocation[] dollars = FindDollarSigns(code).ToArray();
Assert.AreEqual(2, dollars.Length, "Expected 2 dollar signs marking start+end of desired node");
@ -246,7 +246,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -246,7 +246,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
protected ResolveResult ResolveAtLocation(string code)
{
SyntaxTree syntaxTree = new CSharpParser().Parse(new StringReader(code.Replace("$", "")), "test.cs");
SyntaxTree syntaxTree = SyntaxTree.Parse(code.Replace("$", ""), "test.cs");
TextLocation[] dollars = FindDollarSigns(code).ToArray();
Assert.AreEqual(1, dollars.Length, "Expected 1 dollar signs marking the location");

2
ICSharpCode.NRefactory.Tests/Documentation/CSharpCrefLookupTests.cs

@ -55,7 +55,7 @@ class Impl<T> : IGeneric<List<string>[,], T> { @@ -55,7 +55,7 @@ class Impl<T> : IGeneric<List<string>[,], T> {
}";
var pc = new CSharpProjectContent().AddAssemblyReferences(new[] { CecilLoaderTests.Mscorlib });
var syntaxTree = new CSharpParser().Parse(new StringReader(program), "program.cs");
var syntaxTree = SyntaxTree.Parse(program, "program.cs");
var compilation = pc.UpdateProjectContent(null, syntaxTree.ToTypeSystem()).CreateCompilation();
var typeDefinition = compilation.MainAssembly.TopLevelTypeDefinitions.First();
IEntity entity = typeDefinition.Documentation.ResolveCref(cref);

2
ICSharpCode.NRefactory.Tests/Documentation/CSharpDocumentationTests.cs

@ -35,7 +35,7 @@ namespace ICSharpCode.NRefactory.Documentation @@ -35,7 +35,7 @@ namespace ICSharpCode.NRefactory.Documentation
void Init(string program)
{
var pc = new CSharpProjectContent().AddAssemblyReferences(new[] { CecilLoaderTests.Mscorlib });
var syntaxTree = new CSharpParser().Parse(new StringReader(program), "program.cs");
var syntaxTree = SyntaxTree.Parse(program, "program.cs");
compilation = pc.UpdateProjectContent(null, syntaxTree.ToTypeSystem()).CreateCompilation();
typeDefinition = compilation.MainAssembly.TopLevelTypeDefinitions.FirstOrDefault();
}

2
ICSharpCode.NRefactory.Tests/Documentation/IDStringTests.cs

@ -50,7 +50,7 @@ namespace ICSharpCode.NRefactory.Documentation @@ -50,7 +50,7 @@ namespace ICSharpCode.NRefactory.Documentation
{
pc = new IDStringTestProjectContent();
var syntaxTree = new CSharpParser().Parse(new StringReader(program), "program.cs");
var syntaxTree = SyntaxTree.Parse(program, "program.cs");
foreach (var type in syntaxTree.ToTypeSystem().TopLevelTypeDefinitions) {
pc.AddTypeDefinition(type);
}

4
ICSharpCode.NRefactory/IAnnotatable.cs

@ -78,6 +78,10 @@ namespace ICSharpCode.NRefactory @@ -78,6 +78,10 @@ namespace ICSharpCode.NRefactory
void RemoveAnnotations(Type type);
}
/// <summary>
/// Base class used to implement the IAnnotatable interface.
/// This implementation is thread-safe.
/// </summary>
[Serializable]
public abstract class AbstractAnnotatable : IAnnotatable
{

Loading…
Cancel
Save