Siegfried Pammer 13 years ago
parent
commit
d32227f62e
  1. 5
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.atg
  2. 7
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.cs
  3. 1
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinderState.cs
  4. 17
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs
  5. 4005
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Parser.cs
  6. 1
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/PushParser.frame
  7. 2766
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs

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

@ -691,8 +691,9 @@ ConditionalExpression = @@ -691,8 +691,9 @@ ConditionalExpression =
.
LambdaExpression =
SubLambdaExpression |
FunctionLambdaExpression
(. lambdaNestingDepth++; .)
( SubLambdaExpression | FunctionLambdaExpression )
(. lambdaNestingDepth--; .)
.
SubLambdaExpression =

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

@ -40,6 +40,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -40,6 +40,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
nextTokenIsPotentialStartOfExpression = state.NextTokenIsPotentialStartOfExpression;
nextTokenIsStartOfImportsOrAccessExpression = state.NextTokenIsStartOfImportsOrAccessExpression;
readXmlIdentifier = state.ReadXmlIdentifier;
lambdaNestingDepth = state.LambdaNestingDepth;
identifierExpected = state.IdentifierExpected;
stateStack = new Stack<int>(state.StateStack.Reverse());
stack = new Stack<Block>(state.BlockStack.Select(x => (Block)x.Clone()).Reverse());
@ -49,7 +50,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -49,7 +50,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
void Print(string text)
{
//Console.WriteLine(text);
// Console.WriteLine(text);
output.AppendLine(text);
}
@ -107,6 +108,10 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -107,6 +108,10 @@ namespace ICSharpCode.NRefactory.Parser.VB
.IsElement(fx => fx.context == expected);
}
public int LambdaNestingDepth {
get { return lambdaNestingDepth; }
}
public bool NextTokenIsPotentialStartOfExpression {
get { return nextTokenIsPotentialStartOfExpression; }
}

1
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinderState.cs

@ -15,6 +15,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -15,6 +15,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
public bool ReadXmlIdentifier { get; set; }
public bool IdentifierExpected { get; set; }
public bool NextTokenIsStartOfImportsOrAccessExpression { get; set; }
public int LambdaNestingDepth { get; set; }
public Stack<int> StateStack { get; set; }
public Stack<Block> BlockStack { get; set; }
public int CurrentState { get; set; }

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

@ -1136,13 +1136,22 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -1136,13 +1136,22 @@ namespace ICSharpCode.NRefactory.Parser.VB
public override void SkipCurrentBlock(int targetToken)
{
int lastKind = -1;
int kind = base.lastToken.kind;
while (kind != Tokens.EOF &&
!(lastKind == Tokens.End && kind == targetToken))
{
int kind = lastToken.kind;
int lambdaDepth = 0;
while (kind != Tokens.EOF) {
lastKind = kind;
StartPeek();
// lambda nesting depth is not correct at end of lambda,
// so we have to check right before the end
if (Peek().kind == Tokens.End)
lambdaDepth = ef.LambdaNestingDepth;
NextToken();
kind = lastToken.kind;
// special handling for multi line lambdas
// once lambdaDepth <= 0 we've reached the end of the method (after the last End Sub/Function)
if (lastKind == Tokens.End && kind == targetToken && lambdaDepth <= 0)
break;
}
}

4005
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

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

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

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save