Browse Source

Added error expression as ast node.

newNRvisualizers
Mike Krüger 14 years ago
parent
commit
98d1826a74
  1. 42
      ICSharpCode.NRefactory.CSharp/Ast/Expressions/ErrorExpression.cs
  2. 24
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  3. 10
      ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
  4. 5
      ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs
  5. 23
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/VariableDeclarationStatementTests.cs
  6. 4
      ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj

42
ICSharpCode.NRefactory.CSharp/Ast/Expressions/ErrorExpression.cs

@ -0,0 +1,42 @@ @@ -0,0 +1,42 @@
//
// ErrorExpression.cs
//
// Author:
// Mike Krüger <mkrueger@xamarin.com>
//
// Copyright (c) 2011 Xamarin Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
using System;
namespace ICSharpCode.NRefactory.CSharp
{
public class ErrorExpression : EmptyExpression
{
public ErrorExpression ()
{
}
public ErrorExpression (TextLocation location) : base (location)
{
}
}
}

24
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs

@ -415,6 +415,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -415,6 +415,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var contextList = new CompletionDataWrapper (this);
var identifierStart = GetExpressionAtCursor ();
if (identifierStart != null && identifierStart.Item2 is VariableInitializer && location <= ((VariableInitializer)identifierStart.Item2).NameToken.EndLocation) {
return controlSpace ? HandleAccessorContext () ?? DefaultControlSpaceItems () : null;
}
if (!(char.IsLetter (completionChar) || completionChar == '_') && (!controlSpace || identifierStart == null || !(identifierStart.Item2 is ArrayInitializerExpression))) {
return controlSpace ? HandleAccessorContext () ?? DefaultControlSpaceItems () : null;
}
@ -1738,8 +1741,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1738,8 +1741,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
var baseUnit = ParseStub ("");
var tmpUnit = baseUnit;
AstNode expr = baseUnit.GetNodeAt<IdentifierExpression> (location.Line, location.Column - 1);
AstNode expr = baseUnit.GetNodeAt<IdentifierExpression> (location.Line, location.Column - 1);
if (expr == null)
expr = baseUnit.GetNodeAt<Attribute> (location.Line, location.Column - 1);
@ -1762,12 +1766,20 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1762,12 +1766,20 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (expr == null) {
var forStmt = tmpUnit.GetNodeAt<ForStatement> (location.Line, location.Column - 3);
expr = forStmt;
if (forStmt != null && forStmt.EmbeddedStatement.IsNull) {
var id = new IdentifierExpression ("stub");
forStmt.EmbeddedStatement = new BlockStatement () { Statements = { new ExpressionStatement (id) }};
expr = id;
if (forStmt != null && forStmt.Condition is ErrorExpression) {
expr = forStmt;
if (forStmt.EmbeddedStatement.IsNull) {
var id = new IdentifierExpression ("stub");
forStmt.EmbeddedStatement = new BlockStatement () { Statements = { new ExpressionStatement (id) }};
expr = id;
}
baseUnit = tmpUnit;
}
}
if (expr == null) {
expr = tmpUnit.GetNodeAt<VariableInitializer> (location.Line, location.Column - 1);
baseUnit = tmpUnit;
}

10
ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj

@ -308,6 +308,7 @@ @@ -308,6 +308,7 @@
<Compile Include="Completion\ICompletionDataFactory.cs" />
<Compile Include="Completion\IParameterCompletionDataFactory.cs" />
<Compile Include="Ast\GeneralScope\PreProcessorDirective.cs" />
<Compile Include="Ast\Expressions\ErrorExpression.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj">
@ -319,4 +320,13 @@ @@ -319,4 +320,13 @@
<ItemGroup>
<Folder Include="Completion\" />
</ItemGroup>
<ProjectExtensions>
<MonoDevelop>
<Properties>
<Policies>
<TextStylePolicy TabWidth="4" EolMarker="Unix" inheritsSet="Mono" inheritsScope="text/plain" scope="text/plain" />
</Policies>
</Properties>
</MonoDevelop>
</ProjectExtensions>
</Project>

5
ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs

@ -1334,6 +1334,11 @@ namespace ICSharpCode.NRefactory.CSharp @@ -1334,6 +1334,11 @@ namespace ICSharpCode.NRefactory.CSharp
return new ICSharpCode.NRefactory.CSharp.EmptyExpression (Convert (emptyExpression.Location));
}
public override object Visit (Mono.CSharp.ErrorExpression emptyExpression)
{
return new ICSharpCode.NRefactory.CSharp.ErrorExpression (Convert (emptyExpression.Location));
}
public override object Visit (EmptyExpressionStatement emptyExpressionStatement)
{
return new EmptyExpression (Convert (emptyExpressionStatement.Location));

23
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/VariableDeclarationStatementTests.cs

@ -43,7 +43,7 @@ class MyTest @@ -43,7 +43,7 @@ class MyTest
}
}
");
Assert.IsTrue (provider == null || provider.Count == 0, "provider not found.");
Assert.IsTrue (provider == null || provider.Count == 0, "provider should be empty.");
}
[Test()]
@ -80,6 +80,27 @@ class MyTest @@ -80,6 +80,27 @@ class MyTest
Assert.IsNotNull (provider.Find ("myTest"), "name proposal 'myTest' not found.");
Assert.IsNotNull (provider.Find ("test"), "name proposal 'test' not found.");
}
/// <summary>
/// Bug 1799 - [New Resolver] Invalid code completion when typing name of variable
/// </summary>
[Test()]
public void TestBug1799 ()
{
var provider = CodeCompletionBugTests.CreateProvider (
@"
class MyTest
{
public void Test ()
{
for (int n=0;n<10;n++) {
$string d$
}
}
}
");
Assert.IsTrue (provider == null || provider.Count == 0, "provider should be empty.");
}
}
}

4
ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<PropertyGroup>
<ProjectGuid>{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}</ProjectGuid>
@ -17,7 +17,7 @@ @@ -17,7 +17,7 @@
<RunCodeAnalysis>False</RunCodeAnalysis>
<CodeAnalysisRules>-Microsoft.Design#CA1026;-Microsoft.Security#CA2104</CodeAnalysisRules>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\ICSharpCode.NRefactory.snk</AssemblyOriginatorKeyFile>
<AssemblyOriginatorKeyFile>snk</AssemblyOriginatorKeyFile>
<DelaySign>False</DelaySign>
<AssemblyOriginatorKeyMode>File</AssemblyOriginatorKeyMode>
</PropertyGroup>

Loading…
Cancel
Save