Browse Source

implemented handling of XML processing instructions

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@5915 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 15 years ago
parent
commit
d5ea71e4fa
  1. 9
      samples/NRefactoryDemo/NRefactoryDemo.csproj
  2. 2
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/KeywordList.txt
  3. 13
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs
  4. 434
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Tokens.cs
  5. 38
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.atg
  6. 3215
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.cs
  7. 4
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/ParserTests.cs
  8. 37
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/VBNetParserTests.cs
  9. 1
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/VBParserExperiment.csproj
  10. 239
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/XmlModeLexerTests.cs
  11. 4646
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
  12. 2
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG

9
samples/NRefactoryDemo/NRefactoryDemo.csproj

@ -31,9 +31,6 @@ @@ -31,9 +31,6 @@
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
</PropertyGroup>
<ItemGroup>
<Reference Include="ICSharpCode.NRefactory">
<HintPath>..\..\bin\ICSharpCode.NRefactory.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
@ -73,5 +70,11 @@ @@ -73,5 +70,11 @@
<DependentUpon>EditDialog.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Libraries\NRefactory\Project\NRefactory.csproj">
<Project>{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}</Project>
<Name>NRefactory</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>

2
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/KeywordList.txt

@ -30,6 +30,8 @@ XmlOpenEndTag @@ -30,6 +30,8 @@ XmlOpenEndTag
XmlContent
XmlComment
XmlCData
XmlProcessingInstructionStart
XmlProcessingInstructionEnd
# SPECIAL_CHARACTERS
Assign = "="

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

@ -107,6 +107,10 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -107,6 +107,10 @@ namespace ICSharpCode.NRefactory.Parser.VB
ReaderRead();
return new Token(Tokens.XmlStartInlineVB, x, y);
}
if (ReaderPeek() == '?') {
ReaderRead();
return new Token(Tokens.XmlProcessingInstructionStart, x, y);
}
if (ReaderPeek() == '!') {
ReaderRead();
Token token = ReadXmlCommentOrCData(x, y);
@ -132,7 +136,14 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -132,7 +136,14 @@ namespace ICSharpCode.NRefactory.Parser.VB
return new Token(Tokens.XmlEndInlineVB, x, y);
}
break;
case '>': /* workaround for XML Imports */
case '?':
if (ReaderPeek() == '>') {
ReaderRead();
return new Token(Tokens.XmlProcessingInstructionEnd, x, y);
}
break;
case '>':
/* workaround for XML Imports */
if (inXmlCloseTag || (inXmlTag && ef.CurrentContext == Context.Global))
level--;
wasComment = false;

434
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Tokens.cs

@ -26,226 +26,228 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -26,226 +26,228 @@ namespace ICSharpCode.NRefactory.Parser.VB
public const int XmlContent = 16;
public const int XmlComment = 17;
public const int XmlCData = 18;
public const int XmlProcessingInstructionStart = 19;
public const int XmlProcessingInstructionEnd = 20;
// ----- special character -----
public const int Assign = 19;
public const int Colon = 20;
public const int Comma = 21;
public const int ConcatString = 22;
public const int Div = 23;
public const int DivInteger = 24;
public const int Dot = 25;
public const int ExclamationMark = 26;
public const int Minus = 27;
public const int Plus = 28;
public const int Power = 29;
public const int QuestionMark = 30;
public const int Times = 31;
public const int OpenCurlyBrace = 32;
public const int CloseCurlyBrace = 33;
public const int OpenParenthesis = 34;
public const int CloseParenthesis = 35;
public const int GreaterThan = 36;
public const int LessThan = 37;
public const int NotEqual = 38;
public const int GreaterEqual = 39;
public const int LessEqual = 40;
public const int ShiftLeft = 41;
public const int ShiftRight = 42;
public const int PlusAssign = 43;
public const int PowerAssign = 44;
public const int MinusAssign = 45;
public const int TimesAssign = 46;
public const int DivAssign = 47;
public const int DivIntegerAssign = 48;
public const int ShiftLeftAssign = 49;
public const int ShiftRightAssign = 50;
public const int ConcatStringAssign = 51;
public const int ColonAssign = 52;
public const int Assign = 21;
public const int Colon = 22;
public const int Comma = 23;
public const int ConcatString = 24;
public const int Div = 25;
public const int DivInteger = 26;
public const int Dot = 27;
public const int ExclamationMark = 28;
public const int Minus = 29;
public const int Plus = 30;
public const int Power = 31;
public const int QuestionMark = 32;
public const int Times = 33;
public const int OpenCurlyBrace = 34;
public const int CloseCurlyBrace = 35;
public const int OpenParenthesis = 36;
public const int CloseParenthesis = 37;
public const int GreaterThan = 38;
public const int LessThan = 39;
public const int NotEqual = 40;
public const int GreaterEqual = 41;
public const int LessEqual = 42;
public const int ShiftLeft = 43;
public const int ShiftRight = 44;
public const int PlusAssign = 45;
public const int PowerAssign = 46;
public const int MinusAssign = 47;
public const int TimesAssign = 48;
public const int DivAssign = 49;
public const int DivIntegerAssign = 50;
public const int ShiftLeftAssign = 51;
public const int ShiftRightAssign = 52;
public const int ConcatStringAssign = 53;
public const int ColonAssign = 54;
// ----- keywords -----
public const int AddHandler = 53;
public const int AddressOf = 54;
public const int Aggregate = 55;
public const int Alias = 56;
public const int And = 57;
public const int AndAlso = 58;
public const int Ansi = 59;
public const int As = 60;
public const int Ascending = 61;
public const int Assembly = 62;
public const int Auto = 63;
public const int Binary = 64;
public const int Boolean = 65;
public const int ByRef = 66;
public const int By = 67;
public const int Byte = 68;
public const int ByVal = 69;
public const int Call = 70;
public const int Case = 71;
public const int Catch = 72;
public const int CBool = 73;
public const int CByte = 74;
public const int CChar = 75;
public const int CDate = 76;
public const int CDbl = 77;
public const int CDec = 78;
public const int Char = 79;
public const int CInt = 80;
public const int Class = 81;
public const int CLng = 82;
public const int CObj = 83;
public const int Compare = 84;
public const int Const = 85;
public const int Continue = 86;
public const int CSByte = 87;
public const int CShort = 88;
public const int CSng = 89;
public const int CStr = 90;
public const int CType = 91;
public const int CUInt = 92;
public const int CULng = 93;
public const int CUShort = 94;
public const int Custom = 95;
public const int Date = 96;
public const int Decimal = 97;
public const int Declare = 98;
public const int Default = 99;
public const int Delegate = 100;
public const int Descending = 101;
public const int Dim = 102;
public const int DirectCast = 103;
public const int Distinct = 104;
public const int Do = 105;
public const int Double = 106;
public const int Each = 107;
public const int Else = 108;
public const int ElseIf = 109;
public const int End = 110;
public const int EndIf = 111;
public const int Enum = 112;
new public const int Equals = 113;
public const int Erase = 114;
public const int Error = 115;
public const int Event = 116;
public const int Exit = 117;
public const int Explicit = 118;
public const int False = 119;
public const int Finally = 120;
public const int For = 121;
public const int Friend = 122;
public const int From = 123;
public const int Function = 124;
public const int Get = 125;
new public const int GetType = 126;
public const int Global = 127;
public const int GoSub = 128;
public const int GoTo = 129;
public const int Group = 130;
public const int Handles = 131;
public const int If = 132;
public const int Implements = 133;
public const int Imports = 134;
public const int In = 135;
public const int Infer = 136;
public const int Inherits = 137;
public const int Integer = 138;
public const int Interface = 139;
public const int Into = 140;
public const int Is = 141;
public const int IsNot = 142;
public const int Join = 143;
public const int Key = 144;
public const int Let = 145;
public const int Lib = 146;
public const int Like = 147;
public const int Long = 148;
public const int Loop = 149;
public const int Me = 150;
public const int Mod = 151;
public const int Module = 152;
public const int MustInherit = 153;
public const int MustOverride = 154;
public const int MyBase = 155;
public const int MyClass = 156;
public const int Namespace = 157;
public const int Narrowing = 158;
public const int New = 159;
public const int Next = 160;
public const int Not = 161;
public const int Nothing = 162;
public const int NotInheritable = 163;
public const int NotOverridable = 164;
public const int Object = 165;
public const int Of = 166;
public const int Off = 167;
public const int On = 168;
public const int Operator = 169;
public const int Option = 170;
public const int Optional = 171;
public const int Or = 172;
public const int Order = 173;
public const int OrElse = 174;
public const int Overloads = 175;
public const int Overridable = 176;
public const int Overrides = 177;
public const int ParamArray = 178;
public const int Partial = 179;
public const int Preserve = 180;
public const int Private = 181;
public const int Property = 182;
public const int Protected = 183;
public const int Public = 184;
public const int RaiseEvent = 185;
public const int ReadOnly = 186;
public const int ReDim = 187;
public const int Rem = 188;
public const int RemoveHandler = 189;
public const int Resume = 190;
public const int Return = 191;
public const int SByte = 192;
public const int Select = 193;
public const int Set = 194;
public const int Shadows = 195;
public const int Shared = 196;
public const int Short = 197;
public const int Single = 198;
public const int Skip = 199;
public const int Static = 200;
public const int Step = 201;
public const int Stop = 202;
public const int Strict = 203;
public const int String = 204;
public const int Structure = 205;
public const int Sub = 206;
public const int SyncLock = 207;
public const int Take = 208;
public const int Text = 209;
public const int Then = 210;
public const int Throw = 211;
public const int To = 212;
public const int True = 213;
public const int Try = 214;
public const int TryCast = 215;
public const int TypeOf = 216;
public const int UInteger = 217;
public const int ULong = 218;
public const int Unicode = 219;
public const int Until = 220;
public const int UShort = 221;
public const int Using = 222;
public const int Variant = 223;
public const int Wend = 224;
public const int When = 225;
public const int Where = 226;
public const int While = 227;
public const int Widening = 228;
public const int With = 229;
public const int WithEvents = 230;
public const int WriteOnly = 231;
public const int Xor = 232;
public const int AddHandler = 55;
public const int AddressOf = 56;
public const int Aggregate = 57;
public const int Alias = 58;
public const int And = 59;
public const int AndAlso = 60;
public const int Ansi = 61;
public const int As = 62;
public const int Ascending = 63;
public const int Assembly = 64;
public const int Auto = 65;
public const int Binary = 66;
public const int Boolean = 67;
public const int ByRef = 68;
public const int By = 69;
public const int Byte = 70;
public const int ByVal = 71;
public const int Call = 72;
public const int Case = 73;
public const int Catch = 74;
public const int CBool = 75;
public const int CByte = 76;
public const int CChar = 77;
public const int CDate = 78;
public const int CDbl = 79;
public const int CDec = 80;
public const int Char = 81;
public const int CInt = 82;
public const int Class = 83;
public const int CLng = 84;
public const int CObj = 85;
public const int Compare = 86;
public const int Const = 87;
public const int Continue = 88;
public const int CSByte = 89;
public const int CShort = 90;
public const int CSng = 91;
public const int CStr = 92;
public const int CType = 93;
public const int CUInt = 94;
public const int CULng = 95;
public const int CUShort = 96;
public const int Custom = 97;
public const int Date = 98;
public const int Decimal = 99;
public const int Declare = 100;
public const int Default = 101;
public const int Delegate = 102;
public const int Descending = 103;
public const int Dim = 104;
public const int DirectCast = 105;
public const int Distinct = 106;
public const int Do = 107;
public const int Double = 108;
public const int Each = 109;
public const int Else = 110;
public const int ElseIf = 111;
public const int End = 112;
public const int EndIf = 113;
public const int Enum = 114;
new public const int Equals = 115;
public const int Erase = 116;
public const int Error = 117;
public const int Event = 118;
public const int Exit = 119;
public const int Explicit = 120;
public const int False = 121;
public const int Finally = 122;
public const int For = 123;
public const int Friend = 124;
public const int From = 125;
public const int Function = 126;
public const int Get = 127;
new public const int GetType = 128;
public const int Global = 129;
public const int GoSub = 130;
public const int GoTo = 131;
public const int Group = 132;
public const int Handles = 133;
public const int If = 134;
public const int Implements = 135;
public const int Imports = 136;
public const int In = 137;
public const int Infer = 138;
public const int Inherits = 139;
public const int Integer = 140;
public const int Interface = 141;
public const int Into = 142;
public const int Is = 143;
public const int IsNot = 144;
public const int Join = 145;
public const int Key = 146;
public const int Let = 147;
public const int Lib = 148;
public const int Like = 149;
public const int Long = 150;
public const int Loop = 151;
public const int Me = 152;
public const int Mod = 153;
public const int Module = 154;
public const int MustInherit = 155;
public const int MustOverride = 156;
public const int MyBase = 157;
public const int MyClass = 158;
public const int Namespace = 159;
public const int Narrowing = 160;
public const int New = 161;
public const int Next = 162;
public const int Not = 163;
public const int Nothing = 164;
public const int NotInheritable = 165;
public const int NotOverridable = 166;
public const int Object = 167;
public const int Of = 168;
public const int Off = 169;
public const int On = 170;
public const int Operator = 171;
public const int Option = 172;
public const int Optional = 173;
public const int Or = 174;
public const int Order = 175;
public const int OrElse = 176;
public const int Overloads = 177;
public const int Overridable = 178;
public const int Overrides = 179;
public const int ParamArray = 180;
public const int Partial = 181;
public const int Preserve = 182;
public const int Private = 183;
public const int Property = 184;
public const int Protected = 185;
public const int Public = 186;
public const int RaiseEvent = 187;
public const int ReadOnly = 188;
public const int ReDim = 189;
public const int Rem = 190;
public const int RemoveHandler = 191;
public const int Resume = 192;
public const int Return = 193;
public const int SByte = 194;
public const int Select = 195;
public const int Set = 196;
public const int Shadows = 197;
public const int Shared = 198;
public const int Short = 199;
public const int Single = 200;
public const int Skip = 201;
public const int Static = 202;
public const int Step = 203;
public const int Stop = 204;
public const int Strict = 205;
public const int String = 206;
public const int Structure = 207;
public const int Sub = 208;
public const int SyncLock = 209;
public const int Take = 210;
public const int Text = 211;
public const int Then = 212;
public const int Throw = 213;
public const int To = 214;
public const int True = 215;
public const int Try = 216;
public const int TryCast = 217;
public const int TypeOf = 218;
public const int UInteger = 219;
public const int ULong = 220;
public const int Unicode = 221;
public const int Until = 222;
public const int UShort = 223;
public const int Using = 224;
public const int Variant = 225;
public const int Wend = 226;
public const int When = 227;
public const int Where = 228;
public const int While = 229;
public const int Widening = 230;
public const int With = 231;
public const int WithEvents = 232;
public const int WriteOnly = 233;
public const int Xor = 234;
public const int MaxToken = 233;
public const int MaxToken = 235;
static BitArray NewSet(params int[] values)
{
BitArray bitArray = new BitArray(MaxToken);
@ -281,6 +283,8 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -281,6 +283,8 @@ namespace ICSharpCode.NRefactory.Parser.VB
"<XmlContent>",
"<XmlComment>",
"<XmlCData>",
"<XmlProcessingInstructionStart>",
"<XmlProcessingInstructionEnd>",
// ----- special character -----
"=",
":",

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

@ -31,6 +31,8 @@ TOKENS @@ -31,6 +31,8 @@ TOKENS
XmlContent
XmlComment
XmlCData
XmlProcessingInstructionStart
XmlProcessingInstructionEnd
/* ----- special character ----- */
"="
@ -302,7 +304,10 @@ MemberDeclaration = @@ -302,7 +304,10 @@ MemberDeclaration =
{ AttributeBlock } { MemberModifier }
(
MemberVariableOrConstantDeclaration |
SubOrFunctionDeclaration
SubOrFunctionDeclaration |
ExternalMemberDeclaration |
EventMemberDeclaration |
OperatorDeclaration
)
(. PopContext(); .)
.
@ -315,6 +320,31 @@ SubOrFunctionDeclaration = @@ -315,6 +320,31 @@ SubOrFunctionDeclaration =
"End" ("Sub" | "Function") StatementTerminator
.
ExternalMemberDeclaration =
"Declare" [ "Ansi" | "Unicode" | "Auto" ] ( "Sub" | "Function" ) Identifier
"Lib" LiteralString [ "Alias" LiteralString ] [ "(" [ ParameterList ] ")" ] StatementTerminator
.
EventMemberDeclaration =
[ "Custom" ] "Event" Identifier ( "As" TypeName | [ "(" [ ParameterList ] ")" ] )
[ "Implements" TypeName "." IdentifierOrKeyword { "," TypeName "." IdentifierOrKeyword } ]
StatementTerminator
[
{
{ AttributeBlock } ( "AddHandler" | "RemoveHandler" | "RaiseEvent" ) "(" ParameterList ")" EOL
Block
"End" ( "AddHandler" | "RemoveHandler" | "RaiseEvent" ) StatementTerminator
}
"End" "Event" StatementTerminator
]
.
OperatorDeclaration =
"Operator" ANY "(" ParameterList ")" [ "As" { AttributeBlock } TypeName ] EOL
Block
"End" "Operator" StatementTerminator
.
MemberVariableOrConstantDeclaration =
[ "Const" ] Identifier [ "As" TypeName ] [ "=" Expression ] StatementTerminator
.
@ -344,7 +374,7 @@ Expression = @@ -344,7 +374,7 @@ Expression =
( Identifier [ "(" "Of" TypeName { "," TypeName } ")" ] ) |
( "AddressOf" Expression) |
( XmlOpenTag (. PushContext(Context.Xml); .) ANY ">" (. PopContext(); .) )
( XmlOpenTag (. PushContext(Context.Xml); .) ANY XmlCloseTag (. PopContext(); .) )
)
.
@ -470,6 +500,9 @@ MemberModifier = @@ -470,6 +500,9 @@ MemberModifier =
"Overloads" |
"Partial" |
"WithEvents" |
"MustOverride" |
"Widening" |
"Narrowing" |
"Dim"
.
@ -480,6 +513,5 @@ ParameterModifier = @@ -480,6 +513,5 @@ ParameterModifier =
"ParamArray"
.
END ExpressionFinder.

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

File diff suppressed because it is too large Load Diff

4
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/ParserTests.cs

@ -30,7 +30,7 @@ exit Global @@ -30,7 +30,7 @@ exit Global
);
}
[Test]
[Test, Ignore]
public void VariableWithXmlLiteral()
{
RunTest(
@ -58,7 +58,7 @@ exit Global @@ -58,7 +58,7 @@ exit Global
);
}
[Test]
[Test, Ignore]
public void MemberWithXmlLiteral()
{
RunTest(

37
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/VBNetParserTests.cs

@ -1,37 +0,0 @@ @@ -1,37 +0,0 @@
// <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 NUnit.Framework;
namespace VBParserExperiment
{
[TestFixture]
public class VBNetParserTests
{
[Test]
[Ignore]
// TODO : check results
public void CommentAfterEnd()
{
RunTest(
@"Class Test
Sub A()
Dim a = <Test></Test><!-- a --> a
End Sub
End Class",
@""
);
}
void RunTest(string code, string result)
{
throw new NotImplementedException();
}
}
}

1
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/VBParserExperiment.csproj

@ -51,7 +51,6 @@ @@ -51,7 +51,6 @@
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TokenTests.cs" />
<Compile Include="VBNetParserTests.cs" />
<Compile Include="XmlModeLexerTests.cs" />
</ItemGroup>
<ItemGroup>

239
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/XmlModeLexerTests.cs

@ -18,20 +18,7 @@ namespace VBParserExperiment @@ -18,20 +18,7 @@ namespace VBParserExperiment
[TestFixture]
public class XmlModeLexerTests
{
ILexer GenerateLexer(StringReader sr)
{
return ParserFactory.CreateLexer(SupportedLanguage.VBNet, sr);
}
string TestStatement(string stmt)
{
return "Class Test\n" +
"Sub A()\n" +
stmt + "\n" +
"End Sub\n" +
"End Class";
}
#region Xml Tests
[Test]
public void TagWithContent()
{
@ -132,159 +119,62 @@ namespace VBParserExperiment @@ -132,159 +119,62 @@ namespace VBParserExperiment
CheckHead(lexer);
Assert.AreEqual(Tokens.Dim, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Assign, lexer.NextToken().Kind);
#region <menu>
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign,
// <menu>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
#region <course>
Tokens.XmlContent,
// <course name=\"appetizer\">
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Assign, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.LiteralString, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Tokens.XmlContent,
// <dish>Shrimp Cocktail</dish>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Tokens.XmlContent,
// <dish>Escargot</dish>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Tokens.XmlContent,
// </course>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
#endregion
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
#region <course>
Tokens.XmlContent,
// <course name=\"main\">
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Assign, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.LiteralString, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Tokens.XmlContent,
// <dish>Filet Mignon</dish>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Tokens.XmlContent,
// <dish>Garlic Potatoes</dish>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Tokens.XmlContent,
// <dish>Broccoli</dish>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Tokens.XmlContent,
// </course>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
#endregion
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
#region <course>
Tokens.XmlContent,
// <course name=\"dessert\">
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Assign, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.LiteralString, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Tokens.XmlContent,
// <dish>Chocolate Cheesecake</dish>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Tokens.XmlContent,
// </course>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
#endregion
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Tokens.XmlContent,
// </menu>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
#endregion
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag
);
CheckFoot(lexer);
}
@ -435,6 +325,66 @@ namespace DefaultNamespace @@ -435,6 +325,66 @@ namespace DefaultNamespace
CheckFoot(lexer);
}
#endregion
#region Context Tests
[Test]
public void MethodInvocation()
{
ILexer lexer = GenerateLexer(new StringReader(TestStatement("DoSomething(<Test />, True)")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.XmlOpenTag,
Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Comma, Tokens.True,
Tokens.CloseParenthesis);
CheckFoot(lexer);
}
[Test]
public void AddHandlerStatement()
{
ILexer lexer = GenerateLexer(new StringReader(TestStatement("AddHandler <Test />, True")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.AddHandler, Tokens.XmlOpenTag,
Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Comma, Tokens.True);
CheckFoot(lexer);
}
[Test]
public void RemoveHandlerStatement()
{
ILexer lexer = GenerateLexer(new StringReader(TestStatement("RemoveHandler <Test />, <Data>5</Data>")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.RemoveHandler, Tokens.XmlOpenTag,
Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Comma,
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag
);
CheckFoot(lexer);
}
#endregion
#region Helpers
ILexer GenerateLexer(StringReader sr)
{
return ParserFactory.CreateLexer(SupportedLanguage.VBNet, sr);
}
string TestStatement(string stmt)
{
return "Class Test\n" +
"Sub A\n" +
stmt + "\n" +
"End Sub\n" +
"End Class";
}
void CheckFoot(ILexer lexer)
{
@ -444,17 +394,18 @@ namespace DefaultNamespace @@ -444,17 +394,18 @@ namespace DefaultNamespace
void CheckHead(ILexer lexer)
{
CheckTokens(lexer, Tokens.Class, Tokens.Identifier, Tokens.EOL,
Tokens.Sub, Tokens.Identifier, Tokens.OpenParenthesis,
Tokens.CloseParenthesis, Tokens.EOL);
Tokens.Sub, Tokens.Identifier, Tokens.EOL);
}
void CheckTokens(ILexer lexer, params int[] tokens)
{
for (int i = 0; i < tokens.Length; i++) {
int token = tokens[i];
int next = lexer.NextToken().Kind;
Assert.AreEqual(token, next, "{2} {0} != {1}", Tokens.GetTokenString(token), Tokens.GetTokenString(next), i);
Token t = lexer.NextToken();
int next = t.Kind;
Assert.AreEqual(token, next, "{2} of {3}: {0} != {1}; at {4}", Tokens.GetTokenString(token), Tokens.GetTokenString(next), i + 1, tokens.Length, t.Location);
}
}
#endregion
}
}

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

File diff suppressed because it is too large Load Diff

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

@ -30,6 +30,8 @@ TOKENS @@ -30,6 +30,8 @@ TOKENS
XmlContent
XmlComment
XmlCData
XmlProcessingInstructionStart
XmlProcessingInstructionEnd
/* ----- special character ----- */
"="

Loading…
Cancel
Save