Browse Source

- added helper methods to AbstractLexer

- corrected implementation of ReadXmlCommentOrCData
- implemented parsing of XML comments
- fixed parsing XmlMemberAccessExpression in With-Statements

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@6017 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
071185b7d6
  1. 22
      src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexer.cs
  2. 34
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs
  3. 11
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.atg
  4. 2
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.cs
  5. 744
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.cs
  6. 2106
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
  7. 85
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
  8. 1
      src/Libraries/NRefactory/Test/NRefactoryTests.csproj
  9. 40
      src/Libraries/NRefactory/Test/Parser/Expressions/XmlLiteralExpressionTests.cs
  10. 51
      src/Libraries/NRefactory/Test/Parser/Expressions/XmlMemberAccessExpressionTests.cs

22
src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexer.cs

@ -85,7 +85,7 @@ namespace ICSharpCode.NRefactory.Parser
if ((val == '\r' && reader.Peek() != '\n') || val == '\n') { if ((val == '\r' && reader.Peek() != '\n') || val == '\n') {
++line; ++line;
col = 1; col = 1;
LineBreak (); LineBreak();
} else if (val >= 0) { } else if (val >= 0) {
col++; col++;
} }
@ -102,6 +102,26 @@ namespace ICSharpCode.NRefactory.Parser
return reader.Peek(step); return reader.Peek(step);
} }
protected void ReaderSkip(int steps)
{
for (int i = 0; i < steps; i++) {
ReaderRead();
}
}
protected string ReaderPeekString(int length)
{
StringBuilder builder = new StringBuilder();
for (int i = 0; i < length; i++) {
int peek = ReaderPeek(i);
if (peek != -1)
builder.Append((char)peek);
}
return builder.ToString();
}
public void SetInitialLocation(Location location) public void SetInitialLocation(Location location)
{ {
if (lastToken != null || curToken != null || peekToken != null) if (lastToken != null || curToken != null || peekToken != null)

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

@ -101,9 +101,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
for (int i = 0; i < step + 2; i++) for (int i = 0; i < step + 2; i++)
ReaderRead(); ReaderRead();
Token token = ReadXmlCommentOrCData(Col - 1, Line); return ReadXmlCommentOrCData(Col - 1, Line);
ReaderRead();
return token;
} }
break; break;
@ -139,7 +137,6 @@ namespace ICSharpCode.NRefactory.Parser.VB
ReaderRead(); ReaderRead();
Token token = ReadXmlCommentOrCData(x, y); Token token = ReadXmlCommentOrCData(x, y);
info.wasComment = token.Kind == Tokens.XmlComment; info.wasComment = token.Kind == Tokens.XmlComment;
ReaderRead();
return token; return token;
} }
info.level++; info.level++;
@ -364,7 +361,6 @@ namespace ICSharpCode.NRefactory.Parser.VB
ReaderRead(); ReaderRead();
Token t = ReadXmlCommentOrCData(x, y); Token t = ReadXmlCommentOrCData(x, y);
info.wasComment = t.Kind == Tokens.XmlComment; info.wasComment = t.Kind == Tokens.XmlComment;
ReaderRead();
return t; return t;
} }
if (ReaderPeek() == '?') { if (ReaderPeek() == '?') {
@ -411,32 +407,24 @@ namespace ICSharpCode.NRefactory.Parser.VB
sb.Length = 0; sb.Length = 0;
int nextChar = -1; int nextChar = -1;
for (int i = 0; i < 7; i++) { if (string.CompareOrdinal(ReaderPeekString("--".Length), "--") == 0) {
nextChar = ReaderPeek(); ReaderSkip("--".Length);
if (nextChar > -1 && nextChar != '>') {
ReaderRead();
sb.Append((char)nextChar);
}
}
if (sb.ToString().StartsWith("--")) {
sb.Length = 0;
while ((nextChar = ReaderRead()) != -1) { while ((nextChar = ReaderRead()) != -1) {
sb.Append((char)nextChar); sb.Append((char)nextChar);
if (ReaderPeek() == '>' && sb.ToString().EndsWith("--")) { if (string.CompareOrdinal(ReaderPeekString("-->".Length), "-->") == 0) {
string text = sb.Remove(sb.Length - 2, 2).ToString(); ReaderSkip("-->".Length);
return new Token(Tokens.XmlComment, x, y, text); return new Token(Tokens.XmlComment, new Location(x, y), new Location(Col, Line), sb.ToString(), null, LiteralFormat.None);
} }
} }
} }
if (sb.ToString().StartsWith("[CDATA[")) { if (string.CompareOrdinal(ReaderPeekString("[CDATA[".Length), "[CDATA[") == 0) {
sb.Length = 0; ReaderSkip("[CDATA[".Length);
while ((nextChar = ReaderRead()) != -1) { while ((nextChar = ReaderRead()) != -1) {
sb.Append((char)nextChar); sb.Append((char)nextChar);
if (ReaderPeek() == '>' && sb.ToString().EndsWith("]]")) { if (string.CompareOrdinal(ReaderPeekString("]]>".Length), "]]>") == 0) {
string text = sb.Remove(sb.Length - 2, 2).ToString(); ReaderSkip("]]>".Length);
return new Token(Tokens.XmlCData, x, y, text); return new Token(Tokens.XmlCData, new Location(x, y), new Location(Col, Line), sb.ToString(), null, LiteralFormat.None);
} }
} }
} }

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

@ -437,16 +437,17 @@ UnaryOperator =
SimpleExpressionWithSuffix = SimpleExpressionWithSuffix =
{ UnaryOperator } { UnaryOperator }
( (
SimpleExpression { ExpressionSuffix } SimpleExpression { ExpressionSuffix }
| "TypeOf" SimpleExpressionWithSuffix "Is" TypeName | "TypeOf" SimpleExpressionWithSuffix "Is" TypeName
| NewExpression | NewExpression
). )
.
SimpleExpression = SimpleExpression =
( Literal ( Literal
| ( "(" Expression ")" ) | ( "(" Expression ")" )
| IdentifierForExpressionStart | IdentifierForExpressionStart
| ( "." | "!" ) IdentifierOrKeyword | ( "." | "!" | ".@" | "..." ) (. nextTokenIsStartOfImportsOrAccessExpression = true; .) [ XmlOpenTag ] IdentifierOrKeyword [ XmlCloseTag ]
| "GetType" "(" TypeName ")" | "GetType" "(" TypeName ")"
| "GetXmlNamespace" "(" (. readXmlIdentifier = true; .) Identifier ")" | "GetXmlNamespace" "(" (. readXmlIdentifier = true; .) Identifier ")"
| XmlLiteral | XmlLiteral

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

@ -88,6 +88,8 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental
currentState = startOfExpression; currentState = startOfExpression;
break; break;
} }
Advance();
} }
public string Output { public string Output {

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

@ -1752,17 +1752,19 @@ 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 */
XmlOpenTag IdentifierOrKeyword<out name> XmlCloseTag "." (
(. pexpr = new XmlMemberAccessExpression(null, XmlAxisType.Element, name, true); .) XmlOpenTag IdentifierOrKeyword<out name> XmlCloseTag
| IdentifierOrKeyword<out name> (. pexpr = new XmlMemberAccessExpression(null, XmlAxisType.Element, name, true); .)
(. pexpr = new MemberReferenceExpression(null, name); .) | IdentifierOrKeyword<out name>
) | (. pexpr = new MemberReferenceExpression(null, name); .)
(. XmlAxisType axisType = XmlAxisType.Element; bool isXmlIdentifier = false; .) ) |
( "..." (. axisType = XmlAxisType.Descendents; .) | ".@" (. axisType = XmlAxisType.Attribute; .) ) ( (. XmlAxisType axisType = XmlAxisType.Element; bool isXmlIdentifier = false; .)
[ XmlOpenTag (. isXmlIdentifier = true; .) ] IdentifierOrKeyword<out name> [ XmlCloseTag ] ( "..." (. axisType = XmlAxisType.Descendents; .) | ".@" (. axisType = XmlAxisType.Attribute; .) ) (
(. pexpr = new XmlMemberAccessExpression(null, axisType, name, isXmlIdentifier); .) [ XmlOpenTag (. isXmlIdentifier = true; .) ] IdentifierOrKeyword<out name> [ XmlCloseTag ]
(. pexpr = new XmlMemberAccessExpression(null, axisType, name, isXmlIdentifier); .)
)
) )
) )
. .
@ -1772,22 +1774,67 @@ XmlLiteralExpression<out Expression pexpr>
XmlLiteralExpression expr = new XmlLiteralExpression(); XmlLiteralExpression expr = new XmlLiteralExpression();
List<XmlExpression> exprs = expr.Expressions; List<XmlExpression> exprs = expr.Expressions;
XmlExpression currentExpression = null; XmlExpression currentExpression = null;
pexpr = expr;
.) .)
= =
( (
XmlContent (. currentExpression = new XmlContentExpression(t.val, XmlContentType.Text); .) XmlContentExpression<exprs> { XmlContentExpression<exprs> } [ XmlElement<out currentExpression> { XmlContentExpression<exprs> } ]
| XmlCData (. currentExpression = new XmlContentExpression(t.val, XmlContentType.CData); .) |
| XmlComment (. currentExpression = new XmlContentExpression(t.val, XmlContentType.Comment); .) XmlElement<out currentExpression> { XmlContentExpression<exprs> }
| XmlProcessingInstruction (. currentExpression = new XmlContentExpression(t.val, XmlContentType.ProcessingInstruction); .) )
.
XmlContentExpression<List<XmlExpression> exprs> =
(. XmlContentExpression expr = null; .)
(
XmlContent (. expr = new XmlContentExpression(t.val, XmlContentType.Text); .)
| XmlCData (. expr = new XmlContentExpression(t.val, XmlContentType.CData); .)
| XmlComment (. expr = new XmlContentExpression(t.val, XmlContentType.Comment); .)
| XmlProcessingInstruction (. expr = new XmlContentExpression(t.val, XmlContentType.ProcessingInstruction); .)
) )
(. (.
currentExpression.StartLocation = t.Location; expr.StartLocation = t.Location;
currentExpression.EndLocation = t.EndLocation; expr.EndLocation = t.EndLocation;
exprs.Add(currentExpression); exprs.Add(expr);
pexpr = expr;
.) .)
. .
XmlNestedContent<out XmlExpression expr>
(. XmlExpression tmpExpr = null; .)
=
(
XmlContent (. tmpExpr = new XmlContentExpression(t.val, XmlContentType.Text); .)
| XmlCData (. tmpExpr = new XmlContentExpression(t.val, XmlContentType.CData); .)
| XmlComment (. tmpExpr = new XmlContentExpression(t.val, XmlContentType.Comment); .)
| XmlProcessingInstruction (. tmpExpr = new XmlContentExpression(t.val, XmlContentType.ProcessingInstruction); .)
| XmlStartInlineVB (. Expression innerExpression; .) Expr<out innerExpression> XmlEndInlineVB (. tmpExpr = new XmlEmbeddedExpression() { InlineVBExpression = innerExpression }; .)
| XmlElement<out tmpExpr>
)
(. expr = tmpExpr; .)
.
XmlElement<out XmlExpression expr>
(. XmlElementExpression el = new XmlElementExpression(); .)
=
(
XmlOpenTag
( XmlStartInlineVB (. Expression innerExpression; .) Expr<out innerExpression> XmlEndInlineVB
(. el.NameExpression = new XmlEmbeddedExpression() { InlineVBExpression = innerExpression }; .)
| Identifier (. el.XmlName = t.val; .) ) { XmlAttribute<el.Attributes> }
( XmlCloseTagEmptyElement | XmlCloseTag { (. XmlExpression child; .) XmlNestedContent<out child> (. el.Children.Add(child); .) } XmlOpenEndTag { ANY } XmlCloseTag )
)
(. expr = el; .)
.
XmlAttribute<List<XmlExpression> attrs> =
Identifier (. string name = t.val; .) "="
(. string literalValue = null; Expression expressionValue = null; .)
( LiteralString (. literalValue = t.literalValue.ToString(); .) | XmlStartInlineVB Expr<out expressionValue> XmlEndInlineVB )
(. attrs.Add(new XmlAttribute() { Name = name, ExpressionValue = expressionValue, LiteralValue = literalValue }); .)
| XmlStartInlineVB (. Expression innerExpression; .) Expr<out innerExpression> XmlEndInlineVB
(. attrs.Add(new XmlEmbeddedExpression() { InlineVBExpression = innerExpression }); .)
.
ConditionalExpression<out Expression expr> ConditionalExpression<out Expression expr>
(. (.
ConditionalExpression conditionalExpression = new ConditionalExpression(); ConditionalExpression conditionalExpression = new ConditionalExpression();

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\XmlLiteralExpressionTests.cs" />
<Compile Include="Parser\Expressions\XmlMemberAccessExpressionTests.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" />

40
src/Libraries/NRefactory/Test/Parser/Expressions/XmlLiteralExpressionTests.cs

@ -0,0 +1,40 @@
// <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 XmlLiteralExpressionTests
{
#region C#
// no C# representation
#endregion
#region VB.NET
[Test]
public void VBNetSimpleCommentTest()
{
XmlLiteralExpression xle = ParseUtilVBNet.ParseExpression<XmlLiteralExpression>("<!-- test -->");
Assert.IsNotEmpty(xle.Expressions);
Assert.IsTrue(xle.Expressions[0] is XmlContentExpression);
XmlContentExpression content = xle.Expressions[0] as XmlContentExpression;
Assert.AreEqual(XmlContentType.Comment, content.Type);
Assert.AreEqual(" test ", content.Content);
Assert.AreEqual(new Location(1,1), content.StartLocation);
Assert.AreEqual(new Location(14,1), content.EndLocation);
}
#endregion
}
}

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

@ -55,6 +55,57 @@ namespace ICSharpCode.NRefactory.Tests.Ast
Assert.IsTrue(xmae.TargetObject is IdentifierExpression); Assert.IsTrue(xmae.TargetObject is IdentifierExpression);
Assert.AreEqual("xml", ((IdentifierExpression)xmae.TargetObject).Identifier); Assert.AreEqual("xml", ((IdentifierExpression)xmae.TargetObject).Identifier);
} }
[Test]
public void VBNetSimpleDescendentsReferenceTest()
{
XmlMemberAccessExpression xmae = ParseUtilVBNet.ParseExpression<XmlMemberAccessExpression>("xml...<ns:Element>");
Assert.AreEqual("ns:Element", xmae.Identifier);
Assert.IsTrue(xmae.IsXmlIdentifier);
Assert.AreEqual(XmlAxisType.Descendents, xmae.AxisType);
Assert.IsTrue(xmae.TargetObject is IdentifierExpression);
Assert.AreEqual("xml", ((IdentifierExpression)xmae.TargetObject).Identifier);
}
[Test]
public void VBNetSimpleElementReferenceWithDotTest()
{
XmlMemberAccessExpression xmae = ParseUtilVBNet.ParseExpression<XmlMemberAccessExpression>(".<ns:MyElement>");
Assert.AreEqual("ns:MyElement", xmae.Identifier);
Assert.IsTrue(xmae.IsXmlIdentifier);
Assert.AreEqual(XmlAxisType.Element, xmae.AxisType);
Assert.IsTrue(xmae.TargetObject.IsNull);
}
[Test]
public void VBNetSimpleAttributeReferenceWithDotTest()
{
XmlMemberAccessExpression xmae = ParseUtilVBNet.ParseExpression<XmlMemberAccessExpression>(".@attribute");
Assert.AreEqual("attribute", xmae.Identifier);
Assert.IsFalse(xmae.IsXmlIdentifier);
Assert.AreEqual(XmlAxisType.Attribute, xmae.AxisType);
Assert.IsTrue(xmae.TargetObject.IsNull);
}
[Test]
public void VBNetXmlNameAttributeReferenceWithDotTest()
{
XmlMemberAccessExpression xmae = ParseUtilVBNet.ParseExpression<XmlMemberAccessExpression>(".@<ns:attribute>");
Assert.AreEqual("ns:attribute", xmae.Identifier);
Assert.IsTrue(xmae.IsXmlIdentifier);
Assert.AreEqual(XmlAxisType.Attribute, xmae.AxisType);
Assert.IsTrue(xmae.TargetObject.IsNull);
}
[Test]
public void VBNetSimpleDescendentsReferenceWithDotTest()
{
XmlMemberAccessExpression xmae = ParseUtilVBNet.ParseExpression<XmlMemberAccessExpression>("...<ns:Element>");
Assert.AreEqual("ns:Element", xmae.Identifier);
Assert.IsTrue(xmae.IsXmlIdentifier);
Assert.AreEqual(XmlAxisType.Descendents, xmae.AxisType);
Assert.IsTrue(xmae.TargetObject.IsNull);
}
#endregion #endregion
} }
} }

Loading…
Cancel
Save