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 @@ -85,7 +85,7 @@ namespace ICSharpCode.NRefactory.Parser
if ((val == '\r' && reader.Peek() != '\n') || val == '\n') {
++line;
col = 1;
LineBreak ();
LineBreak();
} else if (val >= 0) {
col++;
}
@ -102,6 +102,26 @@ namespace ICSharpCode.NRefactory.Parser @@ -102,6 +102,26 @@ namespace ICSharpCode.NRefactory.Parser
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)
{
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 @@ -101,9 +101,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
for (int i = 0; i < step + 2; i++)
ReaderRead();
Token token = ReadXmlCommentOrCData(Col - 1, Line);
ReaderRead();
return token;
return ReadXmlCommentOrCData(Col - 1, Line);
}
break;
@ -139,7 +137,6 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -139,7 +137,6 @@ namespace ICSharpCode.NRefactory.Parser.VB
ReaderRead();
Token token = ReadXmlCommentOrCData(x, y);
info.wasComment = token.Kind == Tokens.XmlComment;
ReaderRead();
return token;
}
info.level++;
@ -364,7 +361,6 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -364,7 +361,6 @@ namespace ICSharpCode.NRefactory.Parser.VB
ReaderRead();
Token t = ReadXmlCommentOrCData(x, y);
info.wasComment = t.Kind == Tokens.XmlComment;
ReaderRead();
return t;
}
if (ReaderPeek() == '?') {
@ -411,32 +407,24 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -411,32 +407,24 @@ namespace ICSharpCode.NRefactory.Parser.VB
sb.Length = 0;
int nextChar = -1;
for (int i = 0; i < 7; i++) {
nextChar = ReaderPeek();
if (nextChar > -1 && nextChar != '>') {
ReaderRead();
sb.Append((char)nextChar);
}
}
if (sb.ToString().StartsWith("--")) {
sb.Length = 0;
if (string.CompareOrdinal(ReaderPeekString("--".Length), "--") == 0) {
ReaderSkip("--".Length);
while ((nextChar = ReaderRead()) != -1) {
sb.Append((char)nextChar);
if (ReaderPeek() == '>' && sb.ToString().EndsWith("--")) {
string text = sb.Remove(sb.Length - 2, 2).ToString();
return new Token(Tokens.XmlComment, x, y, text);
if (string.CompareOrdinal(ReaderPeekString("-->".Length), "-->") == 0) {
ReaderSkip("-->".Length);
return new Token(Tokens.XmlComment, new Location(x, y), new Location(Col, Line), sb.ToString(), null, LiteralFormat.None);
}
}
}
if (sb.ToString().StartsWith("[CDATA[")) {
sb.Length = 0;
if (string.CompareOrdinal(ReaderPeekString("[CDATA[".Length), "[CDATA[") == 0) {
ReaderSkip("[CDATA[".Length);
while ((nextChar = ReaderRead()) != -1) {
sb.Append((char)nextChar);
if (ReaderPeek() == '>' && sb.ToString().EndsWith("]]")) {
string text = sb.Remove(sb.Length - 2, 2).ToString();
return new Token(Tokens.XmlCData, x, y, text);
if (string.CompareOrdinal(ReaderPeekString("]]>".Length), "]]>") == 0) {
ReaderSkip("]]>".Length);
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 = @@ -437,16 +437,17 @@ UnaryOperator =
SimpleExpressionWithSuffix =
{ UnaryOperator }
(
SimpleExpression { ExpressionSuffix }
| "TypeOf" SimpleExpressionWithSuffix "Is" TypeName
| NewExpression
).
SimpleExpression { ExpressionSuffix }
| "TypeOf" SimpleExpressionWithSuffix "Is" TypeName
| NewExpression
)
.
SimpleExpression =
( Literal
| ( "(" Expression ")" )
| IdentifierForExpressionStart
| ( "." | "!" ) IdentifierOrKeyword
| ( "." | "!" | ".@" | "..." ) (. nextTokenIsStartOfImportsOrAccessExpression = true; .) [ XmlOpenTag ] IdentifierOrKeyword [ XmlCloseTag ]
| "GetType" "(" TypeName ")"
| "GetXmlNamespace" "(" (. readXmlIdentifier = true; .) Identifier ")"
| XmlLiteral

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

@ -88,6 +88,8 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental @@ -88,6 +88,8 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental
currentState = startOfExpression;
break;
}
Advance();
}
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> @@ -1752,17 +1752,19 @@ SimpleNonInvocationExpression<out Expression pexpr>
| /* 11.22 */ ConditionalExpression<out pexpr>
)
|
/* 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); .)
(
/* 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); .)
)
)
)
.
@ -1772,22 +1774,67 @@ XmlLiteralExpression<out Expression pexpr> @@ -1772,22 +1774,67 @@ XmlLiteralExpression<out Expression pexpr>
XmlLiteralExpression expr = new XmlLiteralExpression();
List<XmlExpression> exprs = expr.Expressions;
XmlExpression currentExpression = null;
pexpr = expr;
.)
=
(
XmlContent (. currentExpression = new XmlContentExpression(t.val, XmlContentType.Text); .)
| XmlCData (. currentExpression = new XmlContentExpression(t.val, XmlContentType.CData); .)
| XmlComment (. currentExpression = new XmlContentExpression(t.val, XmlContentType.Comment); .)
| XmlProcessingInstruction (. currentExpression = new XmlContentExpression(t.val, XmlContentType.ProcessingInstruction); .)
XmlContentExpression<exprs> { XmlContentExpression<exprs> } [ XmlElement<out currentExpression> { XmlContentExpression<exprs> } ]
|
XmlElement<out currentExpression> { XmlContentExpression<exprs> }
)
.
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;
currentExpression.EndLocation = t.EndLocation;
exprs.Add(currentExpression);
pexpr = expr;
expr.StartLocation = t.Location;
expr.EndLocation = t.EndLocation;
exprs.Add(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 conditionalExpression = new ConditionalExpression();

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

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

@ -0,0 +1,40 @@ @@ -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 @@ -55,6 +55,57 @@ namespace ICSharpCode.NRefactory.Tests.Ast
Assert.IsTrue(xmae.TargetObject is IdentifierExpression);
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
}
}

Loading…
Cancel
Save