Browse Source

VB: properly fixed ILC-detection after attributes

pull/2/head
Siegfried Pammer 15 years ago
parent
commit
4b1503d40b
  1. 6
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.atg
  2. 4
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.cs
  3. 3
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs
  4. 6417
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Parser.cs
  5. 1
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/PushParser.frame
  6. 27
      src/Libraries/NRefactory/Test/Lexer/VBNet/ImplicitLineContinuationTests.cs

6
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.atg

@ -287,7 +287,7 @@ ImportsStatement = @@ -287,7 +287,7 @@ ImportsStatement =
.
AttributeBlock =
"<" (. PushContext(Context.Attribute, la, t); .) { ANY } ">" (. PopContext(); .) [ EOL ]
"<" (. wasNormalAttribute = true; PushContext(Context.Attribute, la, t); .) [ ( "Assembly" | "Module" ) ":" (. wasNormalAttribute = false; .) ] { ANY } ">" (. PopContext(); .) [ EOL ]
.
NamespaceMemberDeclaration =
@ -551,7 +551,7 @@ Expression @@ -551,7 +551,7 @@ Expression
BinaryOperator =
"+" | "-" | "*" | "\\" | "/" | "^" | "Mod"
| "=" | "<>" | "<" | ">" | "<=" | ">="
| "=" | "<>" | "<" | ">" (. wasNormalAttribute = false; .) | "<=" | ">="
| "Like" | "&" | "And" | "AndAlso" | "Or" | "OrElse"
| "Xor" | "<<" | ">>" | "Is" | "IsNot"
| "^=" | "*=" | "/=" | "\\=" | "+=" | "-=" | "&=" | "<<=" | ">>=" | "To" | ":="
@ -1131,7 +1131,7 @@ SelectStatement = @@ -1131,7 +1131,7 @@ SelectStatement =
.
ComparisonOperator =
"=" | "<>" | "<" | ">" | ">=" | "<="
"=" | "<>" | "<" | ">" (. wasNormalAttribute = false; .) | ">=" | "<="
.
WhileStatement =

4
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.cs

@ -125,6 +125,10 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -125,6 +125,10 @@ namespace ICSharpCode.NRefactory.Parser.VB
get { return isMissingModifier; }
}
public bool WasNormalAttribute {
get { return wasNormalAttribute; }
}
public int ActiveArgument {
get { return activeArgument; }
}

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

@ -436,8 +436,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -436,8 +436,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
// 6th rule
// after a greater-than (>) in a non-file-level attribute context
// HACK cannot detect if token was end of attribute, just allow all GreaterThan tokens
if (prevTokenKind == Tokens.GreaterThan)
if (ef.WasNormalAttribute && prevTokenKind == Tokens.GreaterThan)
return true;
// 7th rule

6417
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Parser.cs

File diff suppressed because it is too large Load Diff

1
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/PushParser.frame

@ -41,6 +41,7 @@ partial class ExpressionFinder { @@ -41,6 +41,7 @@ partial class ExpressionFinder {
bool nextTokenIsStartOfImportsOrAccessExpression = false;
bool isMissingModifier = false;
bool isAlreadyInExpr = false;
bool wasNormalAttribute = false;
int activeArgument = 0;
List<Token> errors = new List<Token>();

27
src/Libraries/NRefactory/Test/Lexer/VBNet/ImplicitLineContinuationTests.cs

@ -170,6 +170,11 @@ Public Class TestContinuation @@ -170,6 +170,11 @@ Public Class TestContinuation
Public Sub TestMethod
Assert.Fail
End Sub
<Test> _
Public Sub TestMethod2
Assert.Fail
End Sub
End Class";
ILexer lexer = GenerateLexer(new StringReader(code));
@ -181,10 +186,32 @@ End Class"; @@ -181,10 +186,32 @@ End Class";
Tokens.Public, Tokens.Sub, Tokens.Identifier, Tokens.EOL,
Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.EOL,
Tokens.End, Tokens.Sub, Tokens.EOL,
Tokens.LessThan, Tokens.Identifier, Tokens.GreaterThan,
Tokens.Public, Tokens.Sub, Tokens.Identifier, Tokens.EOL,
Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.EOL,
Tokens.End, Tokens.Sub, Tokens.EOL,
Tokens.End, Tokens.Class
);
}
[Test]
public void NoILCAfterGlobalAttributes()
{
string code = "<Assembly: AssemblyTitle(\"My.UnitTests\")>" + Environment.NewLine +
"<Assembly: AssemblyDescription(\"\")>";
ILexer lexer = GenerateLexer(new StringReader(code));
CheckTokens(
lexer, Tokens.LessThan, Tokens.Assembly, Tokens.Colon,
Tokens.Identifier, Tokens.OpenParenthesis, Tokens.LiteralString,
Tokens.CloseParenthesis, Tokens.GreaterThan, Tokens.EOL,
Tokens.LessThan, Tokens.Assembly, Tokens.Colon,
Tokens.Identifier, Tokens.OpenParenthesis, Tokens.LiteralString,
Tokens.CloseParenthesis, Tokens.GreaterThan
);
}
#region Helpers
ILexer GenerateLexer(StringReader sr)
{

Loading…
Cancel
Save