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 @@ -1049,5 +1049,10 @@ namespace ICSharpCode.NRefactory.Parser.VB
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 = @@ -413,11 +413,12 @@ StatementTerminatorAndBlock =
.
Expression
(.NamedState:startOfExpression.)
=
(.
if (la != null)
CurrentBlock.lastExpressionStart = la.Location;
.)
=
SimpleExpressionWithSuffix { BinaryOperator SimpleExpressionWithSuffix }
.

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

@ -52,7 +52,7 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental @@ -52,7 +52,7 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental
return;
Block current = stack.Peek();
//
//
// switch (token.kind) {
// case Tokens.EOL:
// case Tokens.Colon:
@ -81,6 +81,15 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental @@ -81,6 +81,15 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental
output.AppendLine(text);
}
public void SetContext(SnippetType type)
{
switch (type) {
case SnippetType.Expression:
currentState = startOfExpression;
break;
}
}
public string Output {
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 { @@ -14,11 +14,13 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental {
partial class ExpressionFinder {
const int startOfExpression = 35;
const int endOfStatementTerminatorAndBlock = 157;
const bool T = true;
const bool x = false;
int currentState = 0;
int currentState = 0;
readonly Stack<int> stateStack = new Stack<int>();
bool nextTokenIsPotentialStartOfXmlMode = false;
@ -54,7 +56,6 @@ int currentState = 0; @@ -54,7 +56,6 @@ int currentState = 0;
nextTokenIsPotentialStartOfXmlMode = false;
readXmlIdentifier = false;
nextTokenIsStartOfImportsOrAccessExpression = false;
const int endOfStatementTerminatorAndBlock = 157;
switchlbl: switch (currentState) {
case 0: {
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> @@ -1675,10 +1675,10 @@ SimpleExpr<out Expression pexpr>
SimpleNonInvocationExpression<out pexpr>
{
"." (
IdentifierOrKeyword<out name>
(. pexpr = new MemberReferenceExpression(pexpr, name); .)
| XmlOpenTag IdentifierOrKeyword<out name> XmlCloseTag
XmlOpenTag IdentifierOrKeyword<out name> XmlCloseTag
(. 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)
"(" "Of" TypeArgumentList<((MemberReferenceExpression)pexpr).TypeArguments> ")"
@ -1752,14 +1752,24 @@ SimpleNonInvocationExpression<out Expression pexpr> @@ -1752,14 +1752,24 @@ SimpleNonInvocationExpression<out Expression pexpr>
| /* 11.22 */ ConditionalExpression<out pexpr>
)
|
/* this form only occurs in WithStatements*/
"." IdentifierOrKeyword<out name> (. pexpr = new MemberReferenceExpression(null, name);.)
/* this form only occurs in WithStatements */
"." (
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 expr = pexpr = new XmlLiteralExpression();
XmlLiteralExpression expr = new XmlLiteralExpression();
List<XmlExpression> exprs = expr.Expressions;
XmlExpression currentExpression = null;
.)
@ -1771,9 +1781,10 @@ XmlLiteralExpression<out Expression pexpr> @@ -1771,9 +1781,10 @@ XmlLiteralExpression<out Expression pexpr>
| XmlProcessingInstruction (. currentExpression = new XmlContentExpression(t.val, XmlContentType.ProcessingInstruction); .)
)
(.
currentExpression.Location = t.Location;
currentExpression.StartLocation = t.Location;
currentExpression.EndLocation = t.EndLocation;
exprs.Add(currentExpression);
pexpr = expr;
.)
.
@ -3541,7 +3552,7 @@ MemberModifier<ModifierList m> = @@ -3541,7 +3552,7 @@ MemberModifier<ModifierList m> =
| "Private" (.m.Add(Modifiers.Private, t.Location);.)
| "Protected" (.m.Add(Modifiers.Protected, 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);.)
| "Shared" (.m.Add(Modifiers.Static, 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 @@ -96,6 +96,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
public override Expression ParseExpression()
{
lexer.SetInitialContext(SnippetType.Expression);
lexer.NextToken();
Location startLocation = la.Location;
Expression expr;

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

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

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

@ -0,0 +1,60 @@ @@ -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