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

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

@ -22,6 +22,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
if (stack.Count > 0) { if (stack.Count > 0) {
string indent = new string('\t', stack.Count - 1); string indent = new string('\t', stack.Count - 1);
var item = stack.Pop(); var item = stack.Pop();
item.isClosed = true;
Print(indent + "exit " + item.context); Print(indent + "exit " + item.context);
} else { } else {
Print("empty stack"); Print("empty stack");
@ -31,10 +32,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
void PushContext(Context context, Token la, Token t) void PushContext(Context context, Token la, Token t)
{ {
string indent = new string('\t', stack.Count); string indent = new string('\t', stack.Count);
Location l = la == null ? Location.Empty : la.EndLocation; Location l = la == null ? Location.Empty : la.Location;
if (la != null)
CurrentBlock.lastExpressionStart = la.Location;
stack.Push(new Block() { context = context, lastExpressionStart = l }); stack.Push(new Block() { context = context, lastExpressionStart = l });
Print(indent + "enter " + context); Print(indent + "enter " + context);
@ -98,6 +96,18 @@ namespace ICSharpCode.NRefactory.Parser.VB
get { return output.ToString(); } get { return output.ToString(); }
} }
public string Stacktrace {
get {
string text = "";
foreach (Block b in stack) {
text += b.ToString() + "\n";
}
return text;
}
}
public Block CurrentBlock { public Block CurrentBlock {
get { return stack.Any() ? stack.Peek() : Block.Default; } get { return stack.Any() ? stack.Peek() : Block.Default; }
} }
@ -148,11 +158,11 @@ namespace ICSharpCode.NRefactory.Parser.VB
public Context context; public Context context;
public Location lastExpressionStart; public Location lastExpressionStart;
public bool isClosed;
public override string ToString() 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
enter IdentifierExpected enter IdentifierExpected
exit IdentifierExpected exit IdentifierExpected
enter Expression enter Expression
enter Xml enter Expression
exit Xml enter Expression
enter Xml
exit Xml
exit Expression
exit Expression
exit Expression exit Expression
exit Body exit Body
exit Member exit Member
@ -80,8 +84,12 @@ End Class
enter IdentifierExpected enter IdentifierExpected
exit IdentifierExpected exit IdentifierExpected
enter Expression enter Expression
enter Xml enter Expression
exit Xml enter Expression
enter Xml
exit Xml
exit Expression
exit Expression
exit Expression exit Expression
exit Member exit Member
enter Member enter Member
@ -91,8 +99,12 @@ End Class
enter IdentifierExpected enter IdentifierExpected
exit IdentifierExpected exit IdentifierExpected
enter Expression enter Expression
enter Xml enter Expression
exit Xml enter Expression
enter Xml
exit Xml
exit Expression
exit Expression
exit Expression exit Expression
exit Body exit Body
exit Member exit Member
@ -126,6 +138,10 @@ End Class
enter IdentifierExpected enter IdentifierExpected
exit IdentifierExpected exit IdentifierExpected
enter Expression enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression exit Expression
exit Body exit Body
exit Member exit Member
@ -159,6 +175,10 @@ End Class
enter IdentifierExpected enter IdentifierExpected
exit IdentifierExpected exit IdentifierExpected
enter Expression enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression exit Expression
exit Body exit Body
exit Member exit Member
@ -192,6 +212,10 @@ End Class
enter IdentifierExpected enter IdentifierExpected
exit IdentifierExpected exit IdentifierExpected
enter Expression enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression exit Expression
exit Body exit Body
exit Member exit Member
@ -222,6 +246,10 @@ End Class
exit IdentifierExpected exit IdentifierExpected
enter Body enter Body
enter Expression enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression exit Expression
enter Body enter Body
exit Body exit Body
@ -264,14 +292,30 @@ End Class
exit IdentifierExpected exit IdentifierExpected
enter Body enter Body
enter IdentifierExpected enter IdentifierExpected
enter Expression
exit Expression
exit IdentifierExpected exit IdentifierExpected
enter Expression enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression exit Expression
enter Body enter Body
exit Body exit Body
enter IdentifierExpected enter IdentifierExpected
enter Expression
exit Expression
exit IdentifierExpected exit IdentifierExpected
enter Expression enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression exit Expression
enter Body enter Body
exit Body exit Body
@ -314,10 +358,24 @@ End Class",
exit IdentifierExpected exit IdentifierExpected
enter Body enter Body
enter Expression enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression exit Expression
enter IdentifierExpected enter IdentifierExpected
enter Expression
exit Expression
exit IdentifierExpected exit IdentifierExpected
enter Expression enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression exit Expression
enter Body enter Body
exit Body exit Body
@ -367,37 +425,85 @@ End Module",
enter Body enter Body
enter Expression enter Expression
enter Expression enter Expression
enter 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 enter IdentifierExpected
exit IdentifierExpected exit IdentifierExpected
enter Expression enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression exit Expression
enter IdentifierExpected enter IdentifierExpected
exit IdentifierExpected exit IdentifierExpected
enter Expression enter Expression
enter Expression enter Expression
exit Expression
enter 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
enter 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 exit Expression
exit Expression exit Expression
enter IdentifierExpected enter IdentifierExpected
exit IdentifierExpected exit IdentifierExpected
enter Expression enter Expression
enter Xml enter Expression
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 Expression
exit Xml exit Expression
exit Expression exit Expression
enter Expression enter Expression
enter Expression
enter Expression
exit Expression
exit Expression
exit Expression exit Expression
exit Body exit Body
exit Member exit Member
@ -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) void RunTest(string code, string expectedOutput)
{ {
ExpressionFinder p = new ExpressionFinder(); ExpressionFinder p = new ExpressionFinder();

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

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

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

@ -8,6 +8,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Parser; using ICSharpCode.NRefactory.Parser;
@ -135,7 +136,44 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet
public ExpressionResult FindFullExpression(string text, int offset) 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) public string RemoveLastPart(string expression)

Loading…
Cancel
Save