提交 8f062669 编写于 作者: D Dustin Campbell 提交者: GitHub

Merge pull request #15531 from vslsnap/merge-dev15-rc2-into-master-20161125-160026

Merge dev15-rc2 into master
...@@ -37,6 +37,8 @@ protected override EnvDTE.vsCMPart DefaultPart ...@@ -37,6 +37,8 @@ protected override EnvDTE.vsCMPart DefaultPart
{ {
switch (node.Kind()) switch (node.Kind())
{ {
case SyntaxKind.ArrowExpressionClause:
return GetStartPoint(text, (ArrowExpressionClauseSyntax)node, part);
case SyntaxKind.Attribute: case SyntaxKind.Attribute:
return GetStartPoint(text, (AttributeSyntax)node, part); return GetStartPoint(text, (AttributeSyntax)node, part);
case SyntaxKind.AttributeArgument: case SyntaxKind.AttributeArgument:
...@@ -83,6 +85,8 @@ protected override EnvDTE.vsCMPart DefaultPart ...@@ -83,6 +85,8 @@ protected override EnvDTE.vsCMPart DefaultPart
{ {
switch (node.Kind()) switch (node.Kind())
{ {
case SyntaxKind.ArrowExpressionClause:
return GetEndPoint(text, (ArrowExpressionClauseSyntax)node, part);
case SyntaxKind.Attribute: case SyntaxKind.Attribute:
return GetEndPoint(text, (AttributeSyntax)node, part); return GetEndPoint(text, (AttributeSyntax)node, part);
case SyntaxKind.AttributeArgument: case SyntaxKind.AttributeArgument:
...@@ -211,6 +215,27 @@ private VirtualTreePoint GetBodyEndPoint(SourceText text, SyntaxToken closeBrace ...@@ -211,6 +215,27 @@ private VirtualTreePoint GetBodyEndPoint(SourceText text, SyntaxToken closeBrace
: new VirtualTreePoint(closeBrace.SyntaxTree, text, closeBrace.SpanStart); : new VirtualTreePoint(closeBrace.SyntaxTree, text, closeBrace.SpanStart);
} }
private VirtualTreePoint GetStartPoint(SourceText text, ArrowExpressionClauseSyntax node, EnvDTE.vsCMPart part)
{
int startPosition;
switch (part)
{
case EnvDTE.vsCMPart.vsCMPartWhole:
startPosition = node.SpanStart;
break;
case EnvDTE.vsCMPart.vsCMPartBody:
startPosition = node.Expression.SpanStart;
break;
default:
throw Exceptions.ThrowENotImpl();
}
return new VirtualTreePoint(node.SyntaxTree, text, startPosition);
}
private VirtualTreePoint GetStartPoint(SourceText text, AttributeSyntax node, EnvDTE.vsCMPart part) private VirtualTreePoint GetStartPoint(SourceText text, AttributeSyntax node, EnvDTE.vsCMPart part)
{ {
int startPosition; int startPosition;
...@@ -759,6 +784,24 @@ private VirtualTreePoint GetStartPoint(SourceText text, ParameterSyntax node, En ...@@ -759,6 +784,24 @@ private VirtualTreePoint GetStartPoint(SourceText text, ParameterSyntax node, En
return new VirtualTreePoint(node.SyntaxTree, text, startPosition); return new VirtualTreePoint(node.SyntaxTree, text, startPosition);
} }
private VirtualTreePoint GetEndPoint(SourceText text, ArrowExpressionClauseSyntax node, EnvDTE.vsCMPart part)
{
int endPosition;
switch (part)
{
case EnvDTE.vsCMPart.vsCMPartWhole:
case EnvDTE.vsCMPart.vsCMPartBody:
endPosition = node.Span.End;
break;
default:
throw Exceptions.ThrowENotImpl();
}
return new VirtualTreePoint(node.SyntaxTree, text, endPosition);
}
private VirtualTreePoint GetEndPoint(SourceText text, AttributeSyntax node, EnvDTE.vsCMPart part) private VirtualTreePoint GetEndPoint(SourceText text, AttributeSyntax node, EnvDTE.vsCMPart part)
{ {
int endPosition; int endPosition;
......
...@@ -1477,6 +1477,15 @@ public override IEnumerable<SyntaxNode> GetParameterNodes(SyntaxNode parentNode) ...@@ -1477,6 +1477,15 @@ public override IEnumerable<SyntaxNode> GetParameterNodes(SyntaxNode parentNode)
return SpecializedCollections.EmptyEnumerable<ParameterSyntax>(); return SpecializedCollections.EmptyEnumerable<ParameterSyntax>();
} }
public override bool IsExpressionBodiedProperty(SyntaxNode node)
=> (node as PropertyDeclarationSyntax)?.ExpressionBody != null;
public override bool TryGetAutoPropertyExpressionBody(SyntaxNode parentNode, out SyntaxNode accessorNode)
{
accessorNode = (parentNode as PropertyDeclarationSyntax)?.ExpressionBody;
return accessorNode != null;
}
public override bool IsAccessorNode(SyntaxNode node) public override bool IsAccessorNode(SyntaxNode node)
{ {
switch (node.Kind()) switch (node.Kind())
......
...@@ -663,10 +663,12 @@ protected bool TryGetElementFromSource(CodeModelState state, Project project, IT ...@@ -663,10 +663,12 @@ protected bool TryGetElementFromSource(CodeModelState state, Project project, IT
return false; return false;
} }
public abstract bool IsExpressionBodiedProperty(SyntaxNode node);
public abstract bool IsAccessorNode(SyntaxNode node); public abstract bool IsAccessorNode(SyntaxNode node);
public abstract MethodKind GetAccessorKind(SyntaxNode node); public abstract MethodKind GetAccessorKind(SyntaxNode node);
public abstract bool TryGetAccessorNode(SyntaxNode parentNode, MethodKind kind, out SyntaxNode accessorNode); public abstract bool TryGetAccessorNode(SyntaxNode parentNode, MethodKind kind, out SyntaxNode accessorNode);
public abstract bool TryGetAutoPropertyExpressionBody(SyntaxNode parentNode, out SyntaxNode accessorNode);
public abstract bool TryGetParameterNode(SyntaxNode parentNode, string name, out SyntaxNode parameterNode); public abstract bool TryGetParameterNode(SyntaxNode parentNode, string name, out SyntaxNode parameterNode);
public abstract bool TryGetImportNode(SyntaxNode parentNode, string dottedName, out SyntaxNode importNode); public abstract bool TryGetImportNode(SyntaxNode parentNode, string dottedName, out SyntaxNode importNode);
public abstract bool TryGetOptionNode(SyntaxNode parentNode, string name, int ordinal, out SyntaxNode optionNode); public abstract bool TryGetOptionNode(SyntaxNode parentNode, string name, int ordinal, out SyntaxNode optionNode);
......
...@@ -146,10 +146,12 @@ internal interface ICodeModelService : ICodeModelNavigationPointService ...@@ -146,10 +146,12 @@ internal interface ICodeModelService : ICodeModelNavigationPointService
SyntaxNode SetAccess(SyntaxNode node, EnvDTE.vsCMAccess access); SyntaxNode SetAccess(SyntaxNode node, EnvDTE.vsCMAccess access);
EnvDTE.vsCMElement GetElementKind(SyntaxNode node); EnvDTE.vsCMElement GetElementKind(SyntaxNode node);
bool IsExpressionBodiedProperty(SyntaxNode node);
bool IsAccessorNode(SyntaxNode node); bool IsAccessorNode(SyntaxNode node);
MethodKind GetAccessorKind(SyntaxNode node); MethodKind GetAccessorKind(SyntaxNode node);
bool TryGetAccessorNode(SyntaxNode parentNode, MethodKind kind, out SyntaxNode accessorNode); bool TryGetAccessorNode(SyntaxNode parentNode, MethodKind kind, out SyntaxNode accessorNode);
bool TryGetAutoPropertyExpressionBody(SyntaxNode parentNode, out SyntaxNode expressionBody);
bool TryGetParameterNode(SyntaxNode parentNode, string name, out SyntaxNode parameterNode); bool TryGetParameterNode(SyntaxNode parentNode, string name, out SyntaxNode parameterNode);
bool TryGetImportNode(SyntaxNode parentNode, string dottedName, out SyntaxNode importNode); bool TryGetImportNode(SyntaxNode parentNode, string dottedName, out SyntaxNode importNode);
bool TryGetOptionNode(SyntaxNode parentNode, string name, int ordinal, out SyntaxNode optionNode); bool TryGetOptionNode(SyntaxNode parentNode, string name, int ordinal, out SyntaxNode optionNode);
......
...@@ -35,15 +35,10 @@ private CodeAccessorFunction(CodeModelState state, AbstractCodeMember parent, Me ...@@ -35,15 +35,10 @@ private CodeAccessorFunction(CodeModelState state, AbstractCodeMember parent, Me
_kind = kind; _kind = kind;
} }
private AbstractCodeMember ParentMember private AbstractCodeMember ParentMember => _parentHandle.Value;
{
get { return _parentHandle.Value; }
}
private bool IsPropertyAccessor() private bool IsPropertyAccessor()
{ => _kind == MethodKind.PropertyGet || _kind == MethodKind.PropertySet;
return _kind == MethodKind.PropertyGet || _kind == MethodKind.PropertySet;
}
internal override bool TryLookupNode(out SyntaxNode node) internal override bool TryLookupNode(out SyntaxNode node)
{ {
...@@ -55,52 +50,29 @@ internal override bool TryLookupNode(out SyntaxNode node) ...@@ -55,52 +50,29 @@ internal override bool TryLookupNode(out SyntaxNode node)
return false; return false;
} }
if (!CodeModelService.TryGetAccessorNode(parentNode, _kind, out var accessorNode)) return CodeModelService.TryGetAutoPropertyExpressionBody(parentNode, out node) ||
{ CodeModelService.TryGetAccessorNode(parentNode, _kind, out node);
return false;
}
node = accessorNode;
return node != null;
} }
public override EnvDTE.vsCMElement Kind public override EnvDTE.vsCMElement Kind
{ => EnvDTE.vsCMElement.vsCMElementFunction;
get { return EnvDTE.vsCMElement.vsCMElementFunction; }
}
public override object Parent public override object Parent => _parentHandle.Value;
{
get { return _parentHandle.Value; }
}
public override EnvDTE.CodeElements Children public override EnvDTE.CodeElements Children
{ => EmptyCollection.Create(this.State, this);
get { return EmptyCollection.Create(this.State, this); }
}
protected override string GetName() protected override string GetName()
{ => this.ParentMember.Name;
return this.ParentMember.Name;
}
protected override void SetName(string value) protected override void SetName(string value)
{ => this.ParentMember.Name = value;
this.ParentMember.Name = value;
}
protected override string GetFullName() protected override string GetFullName()
{ => this.ParentMember.FullName;
return this.ParentMember.FullName;
}
public EnvDTE.CodeElements Attributes public EnvDTE.CodeElements Attributes
{ => AttributeCollection.Create(this.State, this);
get
{
return AttributeCollection.Create(this.State, this);
}
}
public EnvDTE.vsCMAccess Access public EnvDTE.vsCMAccess Access
{ {
...@@ -211,10 +183,7 @@ public EnvDTE80.vsCMOverrideKind OverrideKind ...@@ -211,10 +183,7 @@ public EnvDTE80.vsCMOverrideKind OverrideKind
} }
} }
public bool IsOverloaded public bool IsOverloaded => false;
{
get { return false; }
}
public bool IsShared public bool IsShared
{ {
...@@ -271,12 +240,7 @@ public bool MustImplement ...@@ -271,12 +240,7 @@ public bool MustImplement
} }
public EnvDTE.CodeElements Overloads public EnvDTE.CodeElements Overloads
{ => throw Exceptions.ThrowEFail();
get
{
throw Exceptions.ThrowEFail();
}
}
public EnvDTE.CodeElements Parameters public EnvDTE.CodeElements Parameters
{ {
...@@ -327,4 +291,4 @@ public void RemoveParameter(object element) ...@@ -327,4 +291,4 @@ public void RemoveParameter(object element)
throw Exceptions.ThrowEFail(); throw Exceptions.ThrowEFail();
} }
} }
} }
\ No newline at end of file
...@@ -144,15 +144,17 @@ public override EnvDTE.CodeElements Children ...@@ -144,15 +144,17 @@ public override EnvDTE.CodeElements Children
} }
private bool HasAccessorNode(MethodKind methodKind) private bool HasAccessorNode(MethodKind methodKind)
{ => CodeModelService.TryGetAccessorNode(LookupNode(), methodKind, out var accessorNode);
return CodeModelService.TryGetAccessorNode(LookupNode(), methodKind, out var accessorNode);
} private bool IsExpressionBodiedProperty()
=> CodeModelService.IsExpressionBodiedProperty(LookupNode());
public EnvDTE.CodeFunction Getter public EnvDTE.CodeFunction Getter
{ {
get get
{ {
if (!HasAccessorNode(MethodKind.PropertyGet)) if (!HasAccessorNode(MethodKind.PropertyGet) &&
!IsExpressionBodiedProperty())
{ {
return null; return null;
} }
......
...@@ -54,6 +54,68 @@ class C ...@@ -54,6 +54,68 @@ class C
TextPoint(line:=3, lineOffset:=5, absoluteOffset:=15, lineLength:=16))) TextPoint(line:=3, lineOffset:=5, absoluteOffset:=15, lineLength:=16)))
End Function End Function
<ConditionalWpfFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModel)>
Public Async Function TestAutoPropGetStartPoint1() As Task
Dim code =
<Code>
class C
{
public int $$P => 0;
}
</Code>
Await TestElement(
code,
Sub(prop)
Dim getter = prop.Getter
Dim textPointGetter = Function(part As EnvDTE.vsCMPart)
Return getter.GetStartPoint(part)
End Function
Part(EnvDTE.vsCMPart.vsCMPartAttributes, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartAttributesWithDelimiter, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartBody, TextPoint(line:=3, lineOffset:=21, absoluteOffset:=31, lineLength:=22))(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartBodyWithDelimiter, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartHeader, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartHeaderWithAttributes, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartName, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartNavigate, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartWhole, TextPoint(line:=3, lineOffset:=18, absoluteOffset:=28, lineLength:=22))(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartWholeWithAttributes, ThrowsNotImplementedException)(textPointGetter)
End Sub)
End Function
<ConditionalWpfFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModel)>
Public Async Function TestAutoPropGetEndPoint1() As Task
Dim code =
<Code>
class C
{
public int $$P => 0;
}
</Code>
Await TestElement(
code,
Sub(prop)
Dim getter = prop.Getter
Dim textPointGetter = Function(part As EnvDTE.vsCMPart)
Return getter.GetEndPoint(part)
End Function
Part(EnvDTE.vsCMPart.vsCMPartAttributes, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartAttributesWithDelimiter, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartBody, TextPoint(line:=3, lineOffset:=22, absoluteOffset:=32, lineLength:=22))(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartBodyWithDelimiter, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartHeader, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartHeaderWithAttributes, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartName, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartNavigate, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartWhole, TextPoint(line:=3, lineOffset:=22, absoluteOffset:=32, lineLength:=22))(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartWholeWithAttributes, ThrowsNotImplementedException)(textPointGetter)
End Sub)
End Function
<ConditionalWpfFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModel)> <ConditionalWpfFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModel)>
Public Async Function TestGetStartPoint_Attribute() As Task Public Async Function TestGetStartPoint_Attribute() As Task
Dim code = Dim code =
......
...@@ -1048,6 +1048,14 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.CodeModel ...@@ -1048,6 +1048,14 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.CodeModel
Return GetExternalSymbolFullName(symbol) Return GetExternalSymbolFullName(symbol)
End Function End Function
Public Overrides Function IsExpressionBodiedProperty(node As SyntaxNode) As Boolean
Return False
End Function
Public Overrides Function TryGetAutoPropertyExpressionBody(parentNode As SyntaxNode, ByRef accessorNode As SyntaxNode) As Boolean
Return False
End Function
Public Overrides Function IsAccessorNode(node As SyntaxNode) As Boolean Public Overrides Function IsAccessorNode(node As SyntaxNode) As Boolean
Select Case node.Kind Select Case node.Kind
Case SyntaxKind.GetAccessorBlock, Case SyntaxKind.GetAccessorBlock,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册