Browse Source

implemented XmlMemberAccessExpression in AST

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@6016 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
cea4d02349
  1. 5
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs
  2. 3
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.atg
  3. 11
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.cs
  4. 5
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.cs
  5. 2045
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
  6. 27
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
  7. 1
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNetParser.cs
  8. 1
      src/Libraries/NRefactory/Test/NRefactoryTests.csproj
  9. 60
      src/Libraries/NRefactory/Test/Parser/Expressions/XmlMemberAccessExpressionTests.cs

5
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs

@ -1049,5 +1049,10 @@ namespace ICSharpCode.NRefactory.Parser.VB
kind = lastToken.kind; kind = lastToken.kind;
} }
} }
public void SetInitialContext(SnippetType type)
{
ef.SetContext(type);
}
} }
} }

3
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.atg

@ -413,11 +413,12 @@ StatementTerminatorAndBlock =
. .
Expression Expression
(.NamedState:startOfExpression.)
=
(. (.
if (la != null) if (la != null)
CurrentBlock.lastExpressionStart = la.Location; CurrentBlock.lastExpressionStart = la.Location;
.) .)
=
SimpleExpressionWithSuffix { BinaryOperator SimpleExpressionWithSuffix } SimpleExpressionWithSuffix { BinaryOperator SimpleExpressionWithSuffix }
. .

11
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.cs

@ -52,7 +52,7 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental
return; return;
Block current = stack.Peek(); Block current = stack.Peek();
// //
// switch (token.kind) { // switch (token.kind) {
// case Tokens.EOL: // case Tokens.EOL:
// case Tokens.Colon: // case Tokens.Colon:
@ -81,6 +81,15 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental
output.AppendLine(text); output.AppendLine(text);
} }
public void SetContext(SnippetType type)
{
switch (type) {
case SnippetType.Expression:
currentState = startOfExpression;
break;
}
}
public string Output { public string Output {
get { return output.ToString(); } get { return output.ToString(); }
} }

5
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.cs

@ -14,11 +14,13 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental {
partial class ExpressionFinder { partial class ExpressionFinder {
const int startOfExpression = 35;
const int endOfStatementTerminatorAndBlock = 157;
const bool T = true; const bool T = true;
const bool x = false; const bool x = false;
int currentState = 0; int currentState = 0;
readonly Stack<int> stateStack = new Stack<int>(); readonly Stack<int> stateStack = new Stack<int>();
bool nextTokenIsPotentialStartOfXmlMode = false; bool nextTokenIsPotentialStartOfXmlMode = false;
@ -54,7 +56,6 @@ int currentState = 0;
nextTokenIsPotentialStartOfXmlMode = false; nextTokenIsPotentialStartOfXmlMode = false;
readXmlIdentifier = false; readXmlIdentifier = false;
nextTokenIsStartOfImportsOrAccessExpression = false; nextTokenIsStartOfImportsOrAccessExpression = false;
const int endOfStatementTerminatorAndBlock = 157;
switchlbl: switch (currentState) { switchlbl: switch (currentState) {
case 0: { case 0: {
PushContext(Context.Global, t); PushContext(Context.Global, t);

2045
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs

File diff suppressed because it is too large Load Diff

27
src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG

@ -1675,10 +1675,10 @@ SimpleExpr<out Expression pexpr>
SimpleNonInvocationExpression<out pexpr> SimpleNonInvocationExpression<out pexpr>
{ {
"." ( "." (
IdentifierOrKeyword<out name> XmlOpenTag IdentifierOrKeyword<out name> XmlCloseTag
(. pexpr = new MemberReferenceExpression(pexpr, name); .)
| XmlOpenTag IdentifierOrKeyword<out name> XmlCloseTag
(. pexpr = new XmlMemberAccessExpression(pexpr, XmlAxisType.Element, name, true); .) (. pexpr = new XmlMemberAccessExpression(pexpr, XmlAxisType.Element, name, true); .)
| IdentifierOrKeyword<out name>
(. pexpr = new MemberReferenceExpression(pexpr, name); .)
) )
[ IF (la.kind == Tokens.OpenParenthesis && Peek(1).kind == Tokens.Of) [ IF (la.kind == Tokens.OpenParenthesis && Peek(1).kind == Tokens.Of)
"(" "Of" TypeArgumentList<((MemberReferenceExpression)pexpr).TypeArguments> ")" "(" "Of" TypeArgumentList<((MemberReferenceExpression)pexpr).TypeArguments> ")"
@ -1752,14 +1752,24 @@ SimpleNonInvocationExpression<out Expression pexpr>
| /* 11.22 */ ConditionalExpression<out pexpr> | /* 11.22 */ ConditionalExpression<out pexpr>
) )
| |
/* this form only occurs in WithStatements*/ /* this form only occurs in WithStatements */
"." IdentifierOrKeyword<out name> (. pexpr = new MemberReferenceExpression(null, name);.) "." (
XmlOpenTag IdentifierOrKeyword<out name> XmlCloseTag
(. pexpr = new XmlMemberAccessExpression(null, XmlAxisType.Element, name, true); .)
| IdentifierOrKeyword<out name>
(. pexpr = new MemberReferenceExpression(null, name); .)
) |
(. XmlAxisType axisType = XmlAxisType.Element; bool isXmlIdentifier = false; .)
( "..." (. axisType = XmlAxisType.Descendents; .) | ".@" (. axisType = XmlAxisType.Attribute; .) ) (
[ XmlOpenTag (. isXmlIdentifier = true; .) ] IdentifierOrKeyword<out name> [ XmlCloseTag ]
(. pexpr = new XmlMemberAccessExpression(null, axisType, name, isXmlIdentifier); .)
)
) )
. .
XmlLiteralExpression<out Expression pexpr> XmlLiteralExpression<out Expression pexpr>
(. (.
XmlLiteralExpression expr = pexpr = new XmlLiteralExpression(); XmlLiteralExpression expr = new XmlLiteralExpression();
List<XmlExpression> exprs = expr.Expressions; List<XmlExpression> exprs = expr.Expressions;
XmlExpression currentExpression = null; XmlExpression currentExpression = null;
.) .)
@ -1771,9 +1781,10 @@ XmlLiteralExpression<out Expression pexpr>
| XmlProcessingInstruction (. currentExpression = new XmlContentExpression(t.val, XmlContentType.ProcessingInstruction); .) | XmlProcessingInstruction (. currentExpression = new XmlContentExpression(t.val, XmlContentType.ProcessingInstruction); .)
) )
(. (.
currentExpression.Location = t.Location; currentExpression.StartLocation = t.Location;
currentExpression.EndLocation = t.EndLocation; currentExpression.EndLocation = t.EndLocation;
exprs.Add(currentExpression); exprs.Add(currentExpression);
pexpr = expr;
.) .)
. .
@ -3541,7 +3552,7 @@ MemberModifier<ModifierList m> =
| "Private" (.m.Add(Modifiers.Private, t.Location);.) | "Private" (.m.Add(Modifiers.Private, t.Location);.)
| "Protected" (.m.Add(Modifiers.Protected, t.Location);.) | "Protected" (.m.Add(Modifiers.Protected, t.Location);.)
| "Public" (.m.Add(Modifiers.Public, t.Location);.) | "Public" (.m.Add(Modifiers.Public, t.Location);.)
| "NotInheritable" (.m.Add(Modifiers.Sealed, t.Location);.) | "NotInheritable" (.m.Add(Modifiers.Sealed, t.Location);.)
| "NotOverridable" (.m.Add(Modifiers.Sealed, t.Location);.) | "NotOverridable" (.m.Add(Modifiers.Sealed, t.Location);.)
| "Shared" (.m.Add(Modifiers.Static, t.Location);.) | "Shared" (.m.Add(Modifiers.Static, t.Location);.)
| "Overridable" (.m.Add(Modifiers.Virtual, t.Location);.) | "Overridable" (.m.Add(Modifiers.Virtual, t.Location);.)

1
src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNetParser.cs

@ -96,6 +96,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
public override Expression ParseExpression() public override Expression ParseExpression()
{ {
lexer.SetInitialContext(SnippetType.Expression);
lexer.NextToken(); lexer.NextToken();
Location startLocation = la.Location; Location startLocation = la.Location;
Expression expr; Expression expr;

1
src/Libraries/NRefactory/Test/NRefactoryTests.csproj

@ -66,6 +66,7 @@
<Compile Include="Parser\Expressions\QueryExpressionTests.cs" /> <Compile Include="Parser\Expressions\QueryExpressionTests.cs" />
<Compile Include="Output\SnippetConversion.cs" /> <Compile Include="Output\SnippetConversion.cs" />
<Compile Include="Parser\Expressions\QueryExpressionVBTests.cs" /> <Compile Include="Parser\Expressions\QueryExpressionVBTests.cs" />
<Compile Include="Parser\Expressions\XmlMemberAccessExpressionTests.cs" />
<Compile Include="Parser\GlobalScope\AttributeSectionTests.cs" /> <Compile Include="Parser\GlobalScope\AttributeSectionTests.cs" />
<Compile Include="Output\CSharp\CSharpOutputTest.cs" /> <Compile Include="Output\CSharp\CSharpOutputTest.cs" />
<Compile Include="Parser\Expressions\PrimitiveExpressionTests.cs" /> <Compile Include="Parser\Expressions\PrimitiveExpressionTests.cs" />

60
src/Libraries/NRefactory/Test/Parser/Expressions/XmlMemberAccessExpressionTests.cs

@ -0,0 +1,60 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Siegfried Pammer" email="siegfriedpammer@gmail.com" />
// <version>$Revision$</version>
// </file>
using System;
using System.IO;
using NUnit.Framework;
using ICSharpCode.NRefactory.Parser;
using ICSharpCode.NRefactory.Ast;
namespace ICSharpCode.NRefactory.Tests.Ast
{
[TestFixture]
public class XmlMemberAccessExpressionTests
{
#region C#
// no C# representation
#endregion
#region VB.NET
[Test]
public void VBNetSimpleElementReferenceTest()
{
XmlMemberAccessExpression xmae = ParseUtilVBNet.ParseExpression<XmlMemberAccessExpression>("xml.<ns:MyElement>");
Assert.AreEqual("ns:MyElement", xmae.Identifier);
Assert.IsTrue(xmae.IsXmlIdentifier);
Assert.AreEqual(XmlAxisType.Element, xmae.AxisType);
Assert.IsTrue(xmae.TargetObject is IdentifierExpression);
Assert.AreEqual("xml", ((IdentifierExpression)xmae.TargetObject).Identifier);
}
[Test]
public void VBNetSimpleAttributeReferenceTest()
{
XmlMemberAccessExpression xmae = ParseUtilVBNet.ParseExpression<XmlMemberAccessExpression>("xml.@attribute");
Assert.AreEqual("attribute", xmae.Identifier);
Assert.IsFalse(xmae.IsXmlIdentifier);
Assert.AreEqual(XmlAxisType.Attribute, xmae.AxisType);
Assert.IsTrue(xmae.TargetObject is IdentifierExpression);
Assert.AreEqual("xml", ((IdentifierExpression)xmae.TargetObject).Identifier);
}
[Test]
public void VBNetXmlNameAttributeReferenceTest()
{
XmlMemberAccessExpression xmae = ParseUtilVBNet.ParseExpression<XmlMemberAccessExpression>("xml.@<ns:attribute>");
Assert.AreEqual("ns:attribute", xmae.Identifier);
Assert.IsTrue(xmae.IsXmlIdentifier);
Assert.AreEqual(XmlAxisType.Attribute, xmae.AxisType);
Assert.IsTrue(xmae.TargetObject is IdentifierExpression);
Assert.AreEqual("xml", ((IdentifierExpression)xmae.TargetObject).Identifier);
}
#endregion
}
}
Loading…
Cancel
Save