Browse Source

implemented FindFullExpression

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@6067 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
bb1fa1202e
  1. 58
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.atg
  2. 22
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.cs
  3. 2768
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Parser.cs
  4. 145
      src/Libraries/NRefactory/Test/Lexer/VBNet/LexerContextTests.cs
  5. 18
      src/Main/Base/Test/VBExpressionFinderTests.cs
  6. 40
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetExpressionFinder.cs

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

@ -276,10 +276,14 @@ OptionStatement = @@ -276,10 +276,14 @@ OptionStatement =
.
ImportsStatement =
"Imports"
(. nextTokenIsStartOfImportsOrAccessExpression = true;
if (la != null)
CurrentBlock.lastExpressionStart = la.Location; .) { ANY } StatementTerminator
"Imports"
(.
nextTokenIsStartOfImportsOrAccessExpression = true;
if (la != null)
CurrentBlock.lastExpressionStart = la.Location;
.)
{ ANY }
StatementTerminator
.
AttributeBlock =
@ -305,9 +309,7 @@ TypeDeclaration = @@ -305,9 +309,7 @@ TypeDeclaration =
.
ClassOrModuleOrStructureTypeDeclaration =
( "Module" | "Class" | "Structure" ) (.
if (la != null)
CurrentBlock.lastExpressionStart = la.Location; PushContext(Context.IdentifierExpected, la, t); .) ANY (. PopContext(); .)
( "Module" | "Class" | "Structure" ) (. PushContext(Context.IdentifierExpected, la, t); .) ANY (. PopContext(); .)
[ "(" "Of" [ "Out" | "In" ] IdentifierExceptOut [ "As" GenericConstraintList ] { "," [ "Out" | "In" ] IdentifierExceptOut [ "As" GenericConstraintList ] } ")" ] { ANY } [ StatementTerminator ]
[ "Inherits" { ANY } StatementTerminator ]
[ "Implements" { ANY } StatementTerminator ]
@ -327,8 +329,7 @@ GenericConstraintList = @@ -327,8 +329,7 @@ GenericConstraintList =
DelegateTypeDeclaration =
"Delegate" ("Sub" | "Function")
(. if (la != null)
CurrentBlock.lastExpressionStart = la.Location; PushContext(Context.IdentifierExpected, la, t); .) ANY (. PopContext(); .)
(. PushContext(Context.IdentifierExpected, la, t); .) ANY (. PopContext(); .)
[ "(" [ ParameterList ] ")" ] [ "As" TypeName ] StatementTerminator
.
@ -384,13 +385,7 @@ OperatorDeclaration = @@ -384,13 +385,7 @@ OperatorDeclaration =
MemberVariableOrConstantDeclaration =
[ "Const" ]
(.
if (la != null)
CurrentBlock.lastExpressionStart = la.Location;
PushContext(Context.IdentifierExpected, la, t);
if (la != null)
CurrentBlock.lastExpressionStart = la.Location;
.) IdentifierForFieldDeclaration (. PopContext(); .) [ "As" TypeName ] [ "=" Expression ] StatementTerminator
(. PushContext(Context.IdentifierExpected, la, t); .) IdentifierForFieldDeclaration (. PopContext(); .) [ "As" TypeName ] [ "=" Expression ] StatementTerminator
.
ParameterList =
@ -428,11 +423,7 @@ StatementTerminatorAndBlock = @@ -428,11 +423,7 @@ StatementTerminatorAndBlock =
Expression
(.NamedState:startOfExpression.)
=
(. if (la != null)
CurrentBlock.lastExpressionStart = la.Location; .)
(. PushContext(Context.Expression, la, t); .)
(. if (la != null)
CurrentBlock.lastExpressionStart = la.Location; .)
SimpleExpressionWithSuffix { BinaryOperator SimpleExpressionWithSuffix }
(. PopContext(); .)
.
@ -450,6 +441,7 @@ UnaryOperator = @@ -450,6 +441,7 @@ UnaryOperator =
.
SimpleExpressionWithSuffix =
(. PushContext(Context.Expression, la, t); .)
{ UnaryOperator }
(
SimpleExpression { ExpressionSuffix }
@ -457,12 +449,11 @@ SimpleExpressionWithSuffix = @@ -457,12 +449,11 @@ SimpleExpressionWithSuffix =
| NewExpression
| CollectionInitializer
)
(. PopContext(); .)
.
SimpleExpression
(. if (la != null)
CurrentBlock.lastExpressionStart = la.Location; .)
=
SimpleExpression =
(. PushContext(Context.Expression, la, t); .)
( Literal
| ( "(" Expression ")" )
| IdentifierForExpressionStart
@ -475,6 +466,7 @@ SimpleExpression @@ -475,6 +466,7 @@ SimpleExpression
| CastExpression
| ConditionalExpression
)
(. PopContext(); .)
.
NewExpression =
@ -911,12 +903,7 @@ Literal = @@ -911,12 +903,7 @@ Literal =
"MyClass"
.
Statement
(.
if (la != null)
CurrentBlock.lastExpressionStart = la.Location;
.)
=
Statement =
VariableDeclarationStatement
| WithOrLockStatement
| AddOrRemoveHandlerStatement
@ -938,13 +925,7 @@ Statement @@ -938,13 +925,7 @@ Statement
VariableDeclarationStatement =
( "Dim" | "Static" | "Const" )
(.
if (la != null)
CurrentBlock.lastExpressionStart = la.Location;
PushContext(Context.IdentifierExpected, la, t);
if (la != null)
CurrentBlock.lastExpressionStart = la.Location;
.)
(. PushContext(Context.IdentifierExpected, la, t); .)
Identifier (. PopContext(); .) [ "?" ] [ ( "(" { "," } ")" ) ] { "," (. PushContext(Context.IdentifierExpected, la, t); .) Identifier (. PopContext(); .) [ "?" ] [ ( "(" { "," } ")" ) ] } [ "As" [ "New" ] TypeName ] [ "=" Expression ]
.
@ -1034,8 +1015,7 @@ ForEachLoopStatement = @@ -1034,8 +1015,7 @@ ForEachLoopStatement =
.
ForLoopVariable =
(. if (la != null)
CurrentBlock.lastExpressionStart = la.Location; .)(. PushContext(Context.IdentifierExpected, la, t); .) SimpleExpression (. PopContext(); .) [ "?" ] { ExpressionSuffix } [ "As" TypeName ]
(. PushContext(Context.IdentifierExpected, la, t); .) SimpleExpression (. PopContext(); .) [ "?" ] { ExpressionSuffix } [ "As" TypeName ]
.
ErrorHandlingStatement =

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

@ -22,6 +22,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -22,6 +22,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
if (stack.Count > 0) {
string indent = new string('\t', stack.Count - 1);
var item = stack.Pop();
item.isClosed = true;
Print(indent + "exit " + item.context);
} else {
Print("empty stack");
@ -31,10 +32,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -31,10 +32,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
void PushContext(Context context, Token la, Token t)
{
string indent = new string('\t', stack.Count);
Location l = la == null ? Location.Empty : la.EndLocation;
if (la != null)
CurrentBlock.lastExpressionStart = la.Location;
Location l = la == null ? Location.Empty : la.Location;
stack.Push(new Block() { context = context, lastExpressionStart = l });
Print(indent + "enter " + context);
@ -98,6 +96,18 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -98,6 +96,18 @@ namespace ICSharpCode.NRefactory.Parser.VB
get { return output.ToString(); }
}
public string Stacktrace {
get {
string text = "";
foreach (Block b in stack) {
text += b.ToString() + "\n";
}
return text;
}
}
public Block CurrentBlock {
get { return stack.Any() ? stack.Peek() : Block.Default; }
}
@ -148,11 +158,11 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -148,11 +158,11 @@ namespace ICSharpCode.NRefactory.Parser.VB
public Context context;
public Location lastExpressionStart;
public bool isClosed;
public override string ToString()
{
return string.Format("[Block Context={0}, LastExpressionStart={1}]", context, lastExpressionStart);
return string.Format("[Block Context={0}, LastExpressionStart={1}, IsClosed={2}]", context, lastExpressionStart, isClosed);
}
}
}

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

File diff suppressed because it is too large Load Diff

145
src/Libraries/NRefactory/Test/Lexer/VBNet/LexerContextTests.cs

@ -49,8 +49,12 @@ End Class @@ -49,8 +49,12 @@ End Class
enter IdentifierExpected
exit IdentifierExpected
enter Expression
enter Xml
exit Xml
enter Expression
enter Expression
enter Xml
exit Xml
exit Expression
exit Expression
exit Expression
exit Body
exit Member
@ -80,8 +84,12 @@ End Class @@ -80,8 +84,12 @@ End Class
enter IdentifierExpected
exit IdentifierExpected
enter Expression
enter Xml
exit Xml
enter Expression
enter Expression
enter Xml
exit Xml
exit Expression
exit Expression
exit Expression
exit Member
enter Member
@ -91,8 +99,12 @@ End Class @@ -91,8 +99,12 @@ End Class
enter IdentifierExpected
exit IdentifierExpected
enter Expression
enter Xml
exit Xml
enter Expression
enter Expression
enter Xml
exit Xml
exit Expression
exit Expression
exit Expression
exit Body
exit Member
@ -126,6 +138,10 @@ End Class @@ -126,6 +138,10 @@ End Class
enter IdentifierExpected
exit IdentifierExpected
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
exit Body
exit Member
@ -159,6 +175,10 @@ End Class @@ -159,6 +175,10 @@ End Class
enter IdentifierExpected
exit IdentifierExpected
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
exit Body
exit Member
@ -192,6 +212,10 @@ End Class @@ -192,6 +212,10 @@ End Class
enter IdentifierExpected
exit IdentifierExpected
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
exit Body
exit Member
@ -222,6 +246,10 @@ End Class @@ -222,6 +246,10 @@ End Class
exit IdentifierExpected
enter Body
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
enter Body
exit Body
@ -264,14 +292,30 @@ End Class @@ -264,14 +292,30 @@ End Class
exit IdentifierExpected
enter Body
enter IdentifierExpected
enter Expression
exit Expression
exit IdentifierExpected
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
enter Body
exit Body
enter IdentifierExpected
enter Expression
exit Expression
exit IdentifierExpected
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
enter Body
exit Body
@ -314,10 +358,24 @@ End Class", @@ -314,10 +358,24 @@ End Class",
exit IdentifierExpected
enter Body
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
enter IdentifierExpected
enter Expression
exit Expression
exit IdentifierExpected
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
enter Body
exit Body
@ -367,37 +425,85 @@ End Module", @@ -367,37 +425,85 @@ End Module",
enter Body
enter Expression
enter Expression
enter Expression
exit Expression
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
exit Expression
exit Expression
enter IdentifierExpected
exit IdentifierExpected
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
enter IdentifierExpected
exit IdentifierExpected
enter Expression
enter Expression
exit Expression
enter Expression
exit Expression
enter Expression
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
enter Expression
enter Expression
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
exit Expression
exit Expression
exit Expression
exit Expression
enter IdentifierExpected
exit IdentifierExpected
enter Expression
enter Xml
enter Expression
exit Expression
enter Expression
enter Expression
enter Xml
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
exit Xml
exit Expression
exit Xml
exit Expression
exit Expression
enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression
exit Body
exit Member
@ -406,6 +512,17 @@ exit Global @@ -406,6 +512,17 @@ exit Global
");
}
[Test]
public void Imports()
{
RunTest(@"Imports System
Imports System.Linq
Imports System.Collections.Generic",
@"enter Global
exit Global
");
}
void RunTest(string code, string expectedOutput)
{
ExpressionFinder p = new ExpressionFinder();

18
src/Main/Base/Test/VBExpressionFinderTests.cs

@ -69,7 +69,7 @@ End Class @@ -69,7 +69,7 @@ End Class
[Test]
public void Underscore()
{
FindFull(program1, "der_score_field", "under_score_field", ExpressionContext.Default);
FindFull(program1, "der_score_field", "under_score_field", ExpressionContext.IdentifierExpected);
}
[Test]
@ -81,7 +81,7 @@ End Class @@ -81,7 +81,7 @@ End Class
[Test]
public void LocalVariableDecl()
{
FindFull(program1, "ext", "text", ExpressionContext.Default);
FindFull(program1, "ext", "text", ExpressionContext.IdentifierExpected);
}
[Test]
@ -93,19 +93,19 @@ End Class @@ -93,19 +93,19 @@ End Class
[Test]
public void Imports2()
{
FindFull(program1, "Lin", "System.Linq", ExpressionContext.Global);
FindFull(program1, "inq", "System.Linq", ExpressionContext.Global);
}
[Test]
public void ClassName()
{
FindFull(program1, "ainClas", "MainClass", ExpressionContext.Global);
FindFull(program1, "ainClas", "MainClass", ExpressionContext.IdentifierExpected);
}
[Test]
public void SubName()
{
FindFull(program1, "omeMe", "SomeMethod", ExpressionContext.Default);
FindFull(program1, "omeMe", "SomeMethod", ExpressionContext.IdentifierExpected);
}
#region Old Tests
void OldTest(string expr, int offset)
@ -134,11 +134,17 @@ End Class"; @@ -134,11 +134,17 @@ End Class";
OldTest(".abc.def", 7);
}
[Test, Ignore("FindFullExpression not yet implemented")]
[Test]
public void MethodCall()
{
OldTest("abc.Method().Method()", 16);
}
[Test]
public void ComplexMethodCall()
{
OldTest("abc.Method().Method(5, a.b, 5 + a)", 16);
}
#endregion
}
}

40
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetExpressionFinder.cs

@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Parser;
@ -135,7 +136,44 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet @@ -135,7 +136,44 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet
public ExpressionResult FindFullExpression(string text, int offset)
{
return FindExpression(text, offset);
Init(text, offset);
ExpressionFinder p = new ExpressionFinder();
lexer = ParserFactory.CreateLexer(SupportedLanguage.VBNet, new StringReader(text));
Token t;
Block block = null;
var expressionDelimiters = new[] { Tokens.EOL, Tokens.Colon, Tokens.Dot, Tokens.TripleDot, Tokens.DotAt };
while (true) {
t = lexer.NextToken();
p.InformToken(t);
if (block == null && t.EndLocation >= targetPosition)
block = p.CurrentBlock;
if (block != null && (block.isClosed || expressionDelimiters.Contains(t.Kind) && block == p.CurrentBlock))
break;
}
int tokenOffset;
if (t == null || t.Kind == Tokens.EOF)
tokenOffset = text.Length;
else
tokenOffset = LocationToOffset(t.Location);
int lastExpressionStartOffset = LocationToOffset(block.lastExpressionStart);
if (lastExpressionStartOffset >= 0) {
if (offset < tokenOffset) {
// offset is in front of this token
return MakeResult(text, lastExpressionStartOffset, tokenOffset, GetContext(block));
} else {
// offset is IN this token
return MakeResult(text, lastExpressionStartOffset, offset, GetContext(block));
}
} else {
return new ExpressionResult(null, GetContext(block));
}
}
public string RemoveLastPart(string expression)

Loading…
Cancel
Save