Browse Source

Fixed generic class and method declarations in C# parser.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@153 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 21 years ago
parent
commit
c3c5d155d3
  1. 4
      src/Libraries/NRefactory/NRefactory.sln
  2. 2
      src/Libraries/NRefactory/Project/NRefactory.csproj
  3. 11
      src/Libraries/NRefactory/Project/Src/Parser/AST/General/TypeLevel/MethodDeclaration.cs
  4. 1783
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
  5. 33
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
  6. 27
      src/Libraries/NRefactory/Test/Parser/GlobalScope/DelegateDeclarationTests.cs
  7. 38
      src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs
  8. 51
      src/Libraries/NRefactory/Test/Parser/Statements/YieldStatementTests.cs
  9. 4
      src/Libraries/NRefactory/Test/Parser/TypeLevel/EventDeclarationTests.cs
  10. 42
      src/Libraries/NRefactory/Test/Parser/TypeLevel/MethodDeclarationTests.cs
  11. 14
      src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentEnumerator.cs

4
src/Libraries/NRefactory/NRefactory.sln

@ -1,8 +1,8 @@ @@ -1,8 +1,8 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# SharpDevelop 2.0.0.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.NRefactory", "Project\NRefactory.csproj", "{3a9ae6aa-bc07-4a2f-972c-581e3ae2f195}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.NRefactory.Tests", "Test\NRefactoryTests.csproj", "{870115dd-960a-4406-a6b9-600bcdc36a03}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.NRefactory", "Project\NRefactory.csproj", "{3a9ae6aa-bc07-4a2f-972c-581e3ae2f195}"
EndProject
Global
EndGlobal

2
src/Libraries/NRefactory/Project/NRefactory.csproj

@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.41115</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}</ProjectGuid>
<ProjectGuid>{3a9ae6aa-bc07-4a2f-972c-581e3ae2f195}</ProjectGuid>
<RootNamespace>ICSharpCode.NRefactory</RootNamespace>
<AssemblyName>ICSharpCode.NRefactory</AssemblyName>
<OutputTarget>Library</OutputTarget>

11
src/Libraries/NRefactory/Project/Src/Parser/AST/General/TypeLevel/MethodDeclaration.cs

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
using System;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
namespace ICSharpCode.NRefactory.Parser.AST
@ -29,6 +30,16 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -29,6 +30,16 @@ namespace ICSharpCode.NRefactory.Parser.AST
ArrayList handlesClause = new ArrayList(); // VB only
ArrayList implementsClause = new ArrayList(); // VB only
AttributeSection returnTypeAttributeSection = AttributeSection.Null;
List<TemplateDefinition> templates = new List<TemplateDefinition>();
public List<TemplateDefinition> Templates {
get {
return templates;
}
set {
templates = value;
}
}
public AttributeSection ReturnTypeAttributeSection {
get {

1783
src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs

File diff suppressed because it is too large Load Diff

33
src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG

@ -666,10 +666,11 @@ TypeDecl<Modifiers m, ArrayList attributes> @@ -666,10 +666,11 @@ TypeDecl<Modifiers m, ArrayList attributes>
ArrayList names;
ArrayList p;
string name;
List<TemplateDefinition> templates = new List<TemplateDefinition>();
List<TemplateDefinition> templates;
.)
= /*--- class declaration: */ (. m.Check(Modifier.Classes); .)
"class" (. TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes);
templates = newType.Templates;
compilationUnit.AddChild(newType);
compilationUnit.BlockStart(newType);
@ -691,7 +692,7 @@ TypeDecl<Modifiers m, ArrayList attributes> @@ -691,7 +692,7 @@ TypeDecl<Modifiers m, ArrayList attributes>
.)
| /*--- struct declaration: */ (. m.Check(Modifier.StructsInterfacesEnumsDelegates); .)
( "struct" (. TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes);
newType.Templates = templates;
templates = newType.Templates;
compilationUnit.AddChild(newType);
compilationUnit.BlockStart(newType);
newType.Type = Types.Struct;
@ -713,7 +714,7 @@ TypeDecl<Modifiers m, ArrayList attributes> @@ -713,7 +714,7 @@ TypeDecl<Modifiers m, ArrayList attributes>
.)
| /*--- interface declaration: */
"interface" (. TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes);
newType.Templates = templates;
templates = newType.Templates;
compilationUnit.AddChild(newType);
compilationUnit.BlockStart(newType);
newType.Type = Types.Interface;
@ -1035,6 +1036,7 @@ StructMemberDecl<Modifiers m, ArrayList attributes> @@ -1035,6 +1036,7 @@ StructMemberDecl<Modifiers m, ArrayList attributes>
attributes);
methodDeclaration.StartLocation = startPos;
methodDeclaration.EndLocation = t.EndLocation;
methodDeclaration.Templates = templates;
compilationUnit.AddChild(methodDeclaration);
compilationUnit.BlockStart(methodDeclaration);
.)
@ -1169,16 +1171,21 @@ StructMemberDecl<Modifiers m, ArrayList attributes> @@ -1169,16 +1171,21 @@ StructMemberDecl<Modifiers m, ArrayList attributes>
(
/*--- "not void" method (function) declaration: */
( (. m.Check(Modifier.PropertysEventsMethods); .)
"(" [ FormalParameterList<out p> ] ")" (. MethodDeclaration methodDeclaration = new MethodDeclaration(qualident,
m.Modifier,
type,
p,
attributes);
methodDeclaration.StartLocation = startPos;
methodDeclaration.EndLocation = t.EndLocation;
compilationUnit.AddChild(methodDeclaration);
.)
( Block<out stmt> | ";" ) (. methodDeclaration.Body = (BlockStatement)stmt; .)
/* .NET 2.0 */
[ TypeParameterList<templates> ]
"(" [ FormalParameterList<out p> ] ")" (.
MethodDeclaration methodDeclaration = new MethodDeclaration(qualident,
m.Modifier,
type,
p,
attributes);
methodDeclaration.StartLocation = startPos;
methodDeclaration.EndLocation = t.EndLocation;
methodDeclaration.Templates = templates;
compilationUnit.AddChild(methodDeclaration);
.)
{ IF (IdentIsWhere()) TypeParameterConstraintsClause<templates> }
( Block<out stmt> | ";" ) (. methodDeclaration.Body = (BlockStatement)stmt; .)
/*--- property declaration: */
| "{" (. PropertyDeclaration pDecl = new PropertyDeclaration(qualident, type, m.Modifier, attributes);

27
src/Libraries/NRefactory/Test/Parser/GlobalScope/DelegateDeclarationTests.cs

@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
* User: Omnibrain
* Date: 13.09.2004
* Time: 19:54
*
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
@ -24,6 +24,10 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -24,6 +24,10 @@ namespace ICSharpCode.NRefactory.Tests.AST
{
Assert.AreEqual("System.Void", dd.ReturnType.SystemType);
Assert.AreEqual("MyDelegate", dd.Name);
}
void TestParameters(DelegateDeclaration dd)
{
Assert.AreEqual(3, dd.Parameters.Count);
Assert.AreEqual("a", ((ParameterDeclarationExpression)dd.Parameters[0]).ParameterName);
@ -43,6 +47,27 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -43,6 +47,27 @@ namespace ICSharpCode.NRefactory.Tests.AST
string program = "public delegate void MyDelegate(int a, int secondParam, MyObj lastParam);\n";
TestDelegateDeclaration((DelegateDeclaration)ParseUtilCSharp.ParseGlobal(program, typeof(DelegateDeclaration)));
}
[Test]
public void CSharpDelegateWithoutNameDeclarationTest()
{
string program = "public delegate void(int a, int secondParam, MyObj lastParam);\n";
DelegateDeclaration dd = (DelegateDeclaration)ParseUtilCSharp.ParseGlobal(program, typeof(DelegateDeclaration), true);
Assert.AreEqual("System.Void", dd.ReturnType.SystemType);
Assert.AreEqual("?", dd.Name);
TestParameters(dd);
}
[Test]
public void CSharpGenericDelegateDeclarationTest()
{
string program = "public delegate T CreateObject<T>(int a, int secondParam, MyObj lastParam);\n";
DelegateDeclaration dd = (DelegateDeclaration)ParseUtilCSharp.ParseGlobal(program, typeof(DelegateDeclaration));
Assert.AreEqual("CreateObject", dd.Name);
Assert.AreEqual("T", dd.ReturnType.Type);
TestParameters(dd);
Assert.Fail("Getting type parameters not implemented.");
}
#endregion
#region VB.NET

38
src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs

@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
* User: Omnibrain
* Date: 13.09.2004
* Time: 19:54
*
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
@ -61,7 +61,8 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -61,7 +61,8 @@ namespace ICSharpCode.NRefactory.Tests.AST
Assert.AreEqual("G", td.Name);
Assert.AreEqual(Modifier.Public, td.Modifier);
Assert.AreEqual(0, td.BaseTypes.Count);
// TODO: test the generic stuff
Assert.AreEqual(1, td.Templates.Count);
Assert.AreEqual("T", td.Templates[0].Name);
}
@ -69,7 +70,7 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -69,7 +70,7 @@ namespace ICSharpCode.NRefactory.Tests.AST
public void CSharpGenericClassWithWhere()
{
string declr = @"
public class Test<T> where T : IMyInterface
public class Test<T> where T : IMyInterface
{
}
";
@ -77,14 +78,17 @@ public class Test<T> where T : IMyInterface @@ -77,14 +78,17 @@ public class Test<T> where T : IMyInterface
Assert.AreEqual(Types.Class, td.Type);
Assert.AreEqual("Test", td.Name);
// TODO: test the generic stuff
Assert.AreEqual(1, td.Templates.Count);
Assert.AreEqual("T", td.Templates[0].Name);
Assert.AreEqual("IMyInterface", td.Templates[0].Bases[0].Type);
}
[Test]
public void CSharpComplexGenericClassTypeDeclarationTest()
{
string declr = @"
public class Generic<T, S> : System.IComparable where S : G<T[]> where T : MyNamespace.IMyInterface
public class Generic<T, S> : System.IComparable where S : G<T[]> where T : MyNamespace.IMyInterface
{
}
";
@ -95,7 +99,17 @@ public class Generic<T, S> : System.IComparable where S : G<T[]> where T : MyNa @@ -95,7 +99,17 @@ public class Generic<T, S> : System.IComparable where S : G<T[]> where T : MyNa
Assert.AreEqual(Modifier.Public, td.Modifier);
Assert.AreEqual(1, td.BaseTypes.Count);
Assert.AreEqual("System.IComparable", td.BaseTypes[0]);
// TODO: test the generic stuff
Assert.AreEqual(2, td.Templates.Count);
Assert.AreEqual("T", td.Templates[0].Name);
Assert.AreEqual("MyNamespace.IMyInterface", td.Templates[0].Bases[0].Type);
Assert.AreEqual("S", td.Templates[1].Name);
Assert.AreEqual("G", td.Templates[1].Bases[0].Type);
Assert.AreEqual(1, td.Templates[1].Bases[0].GenericTypes.Count);
Assert.IsTrue(td.Templates[1].Bases[0].GenericTypes[0].IsArrayType);
Assert.AreEqual("T", td.Templates[1].Bases[0].GenericTypes[0].Type);
Assert.AreEqual(new int[] {0}, td.Templates[1].Bases[0].GenericTypes[0].RankSpecifier);
}
[Test]
@ -103,7 +117,7 @@ public class Generic<T, S> : System.IComparable where S : G<T[]> where T : MyNa @@ -103,7 +117,7 @@ public class Generic<T, S> : System.IComparable where S : G<T[]> where T : MyNa
{
string declr = @"
[MyAttr()]
public abstract class MyClass : MyBase, Interface1, My.Test.Interface2
public abstract class MyClass : MyBase, Interface1, My.Test.Interface2
{
}
";
@ -152,40 +166,38 @@ public abstract class MyClass : MyBase, Interface1, My.Test.Interface2 @@ -152,40 +166,38 @@ public abstract class MyClass : MyBase, Interface1, My.Test.Interface2
public void VBNetSimpleClassTypeDeclarationTest()
{
string program = "Class TestClass\n" +
"End Class\n";
"End Class\n";
TypeDeclaration td = (TypeDeclaration)ParseUtilVBNet.ParseGlobal(program, typeof(TypeDeclaration));
Assert.AreEqual("TestClass", td.Name);
Assert.AreEqual(Types.Class, td.Type);
Assert.AreEqual(1, td.StartLocation.Y, "start line");
Assert.AreEqual(2, td.EndLocation.Y, "end line");
// Assert.IsFalse(td.IsPartialType);
}
[Test]
public void VBNetSimpleClassTypeDeclarationWithoutLastNewLineTest()
{
string program = "Class TestClass\n" +
"End Class";
"End Class";
TypeDeclaration td = (TypeDeclaration)ParseUtilVBNet.ParseGlobal(program, typeof(TypeDeclaration));
Assert.AreEqual("TestClass", td.Name);
Assert.AreEqual(Types.Class, td.Type);
Assert.AreEqual(1, td.StartLocation.Y, "start line");
Assert.AreEqual(2, td.EndLocation.Y, "end line");
// Assert.IsFalse(td.IsPartialType);
}
[Test]
public void VBNetSimplePartialClassTypeDeclarationTest()
{
string program = "Partial Class TestClass\n" +
"End Class\n";
"End Class\n";
TypeDeclaration td = (TypeDeclaration)ParseUtilVBNet.ParseGlobal(program, typeof(TypeDeclaration));
Assert.AreEqual("TestClass", td.Name);
Assert.AreEqual(Types.Class, td.Type);
// Assert.IsTrue(td.IsPartialType);
Assert.AreEqual(Modifier.Partial, td.Modifier);
}
#endregion
}

51
src/Libraries/NRefactory/Test/Parser/Statements/YieldStatementTests.cs

@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
/*
* Created by SharpDevelop.
* User: Daniel Grunwald
* Date: 21.05.2005
* Time: 17:54
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.IO;
using NUnit.Framework;
using ICSharpCode.NRefactory.Parser;
using ICSharpCode.NRefactory.Parser.AST;
namespace ICSharpCode.NRefactory.Tests.AST
{
[TestFixture]
public class YieldStatementTests
{
[Test]
public void YieldReturnStatementTest()
{
YieldStatement yieldStmt = (YieldStatement)ParseUtilCSharp.ParseStatment("yield return \"Foo\";", typeof(YieldStatement));
Assert.IsTrue(yieldStmt.IsYieldReturn());
ReturnStatement retStmt = (ReturnStatement)yieldStmt.Statement;
PrimitiveExpression expr = (PrimitiveExpression)retStmt.Expression;
Assert.AreEqual("Foo", expr.Value);
}
[Test]
public void YieldBreakStatementTest()
{
YieldStatement yieldStmt = (YieldStatement)ParseUtilCSharp.ParseStatment("yield break;", typeof(YieldStatement));
Assert.IsTrue(yieldStmt.IsYieldBreak());
}
[Test]
public void YieldAsVariableTest()
{
StatementExpression se = (StatementExpression)ParseUtilCSharp.ParseStatment("yield = 3;", typeof(StatementExpression));
AssignmentExpression ae = se.Expression as AssignmentExpression;
Assert.AreEqual(AssignmentOperatorType.Assign, ae.Op);
Assert.IsTrue(ae.Left is IdentifierExpression);
Assert.AreEqual("yield", ((IdentifierExpression)ae.Left).Identifier);
Assert.IsTrue(ae.Right is PrimitiveExpression);
}
}
}

4
src/Libraries/NRefactory/Test/Parser/TypeLevel/EventDeclarationTests.cs

@ -29,8 +29,8 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -29,8 +29,8 @@ namespace ICSharpCode.NRefactory.Tests.AST
Assert.AreEqual("MyEvent", ((VariableDeclaration)ed.VariableDeclarators[0]).Name);
Assert.AreEqual("System.EventHandler", ed.TypeReference.Type);
Assert.IsTrue(!ed.HasAddRegion);
Assert.IsTrue(!ed.HasRemoveRegion);
Assert.IsFalse(ed.HasAddRegion);
Assert.IsFalse(ed.HasRemoveRegion);
}
[Test]

42
src/Libraries/NRefactory/Test/Parser/TypeLevel/MethodDeclarationTests.cs

@ -37,6 +37,48 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -37,6 +37,48 @@ namespace ICSharpCode.NRefactory.Tests.AST
Assert.AreEqual(1, md.Parameters.Count);
Assert.AreEqual("?", ((ParameterDeclarationExpression)md.Parameters[0]).ParameterName);
}
[Test]
public void CSharpGenericVoidMethodDeclarationTest()
{
MethodDeclaration md = (MethodDeclaration)ParseUtilCSharp.ParseTypeMember("void MyMethod<T>(T a) {} ", typeof(MethodDeclaration));
Assert.AreEqual("void", md.TypeReference.Type);
Assert.AreEqual(1, md.Parameters.Count);
Assert.AreEqual("T", ((ParameterDeclarationExpression)md.Parameters[0]).TypeReference.Type);
Assert.AreEqual("a", ((ParameterDeclarationExpression)md.Parameters[0]).ParameterName);
Assert.AreEqual(1, md.Templates.Count);
Assert.AreEqual("T", md.Templates[0].Name);
}
[Test]
public void CSharpGenericMethodDeclarationTest()
{
MethodDeclaration md = (MethodDeclaration)ParseUtilCSharp.ParseTypeMember("T MyMethod<T>(T a) {} ", typeof(MethodDeclaration));
Assert.AreEqual("T", md.TypeReference.Type);
Assert.AreEqual(1, md.Parameters.Count);
Assert.AreEqual("T", ((ParameterDeclarationExpression)md.Parameters[0]).TypeReference.Type);
Assert.AreEqual("a", ((ParameterDeclarationExpression)md.Parameters[0]).ParameterName);
Assert.AreEqual(1, md.Templates.Count);
Assert.AreEqual("T", md.Templates[0].Name);
}
[Test]
public void CSharpGenericMethodDeclarationWithConstraintTest()
{
string program = "T MyMethod<T>(T a) where T : ISomeInterface {} ";
MethodDeclaration md = (MethodDeclaration)ParseUtilCSharp.ParseTypeMember(program, typeof(MethodDeclaration));
Assert.AreEqual("T", md.TypeReference.Type);
Assert.AreEqual(1, md.Parameters.Count);
Assert.AreEqual("T", ((ParameterDeclarationExpression)md.Parameters[0]).TypeReference.Type);
Assert.AreEqual("a", ((ParameterDeclarationExpression)md.Parameters[0]).ParameterName);
Assert.AreEqual(1, md.Templates.Count);
Assert.AreEqual("T", md.Templates[0].Name);
Assert.AreEqual(1, md.Templates[0].Bases.Count);
Assert.AreEqual("ISomeInterface", md.Templates[0].Bases[0].Type);
}
#endregion
#region VB.NET

14
src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentEnumerator.cs

@ -115,10 +115,16 @@ namespace ICSharpCode.SharpDevelop.Project @@ -115,10 +115,16 @@ namespace ICSharpCode.SharpDevelop.Project
if (item.ItemType != ItemType.Compile)
return MoveNext();
string fileContent;
if (res != null) {
fileContent = pcd.EndInvoke(res);
} else {
fileContent = GetFileContent(item);
try {
if (res != null) {
fileContent = pcd.EndInvoke(res);
} else {
fileContent = GetFileContent(item);
}
} catch (IOException ex) {
res = null;
Console.WriteLine(ex);
return MoveNext(); // skip invalid files
}
if (nextItem != null && nextItem.ItemType == ItemType.Compile && CanReadAsync(nextItem))
res = pcd.BeginInvoke(nextItem.Project, nextItem.FileName, null, null);

Loading…
Cancel
Save