Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
9193aee7
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9193aee7
编写于
8月 26, 2015
作者:
C
Cyrus Najmabadi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Be less aggressive about parsing out accessors in an accessor list.
上级
714868a1
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
67 addition
and
4 deletion
+67
-4
src/Compilers/CSharp/Portable/Parser/LanguageParser.cs
src/Compilers/CSharp/Portable/Parser/LanguageParser.cs
+50
-4
src/EditorFeatures/CSharpTest/Completion/CompletionProviders/SymbolCompletionProviderTests.cs
...tion/CompletionProviders/SymbolCompletionProviderTests.cs
+17
-0
未找到文件。
src/Compilers/CSharp/Portable/Parser/LanguageParser.cs
浏览文件 @
9193aee7
...
...
@@ -1340,7 +1340,12 @@ private static SyntaxModifier GetFieldModifier(SyntaxToken token)
private
bool
IsPossibleModifier
()
{
return
GetModifier
(
this
.
CurrentToken
)
!=
SyntaxModifier
.
None
;
return
IsPossibleModifier
(
this
.
CurrentToken
);
}
private
bool
IsPossibleModifier
(
SyntaxToken
token
)
{
return
GetModifier
(
token
)
!=
SyntaxModifier
.
None
;
}
private
void
ParseModifiers
(
SyntaxListBuilder
tokens
)
...
...
@@ -3411,12 +3416,53 @@ private PostSkipAction SkipBadAccessorListTokens(ref SyntaxToken openBrace, Synt
private
bool
IsPossibleAccessor
()
{
return
this
.
CurrentToken
.
Kind
==
SyntaxKind
.
IdentifierToken
if
(
this
.
CurrentToken
.
Kind
==
SyntaxKind
.
IdentifierToken
||
IsPossibleAttributeDeclaration
()
||
IsPossibleModifier
()
||
SyntaxFacts
.
GetAccessorDeclarationKind
(
this
.
CurrentToken
.
ContextualKind
)
!=
SyntaxKind
.
None
||
this
.
CurrentToken
.
Kind
==
SyntaxKind
.
OpenBraceToken
// for accessor blocks w/ missing keyword
||
this
.
CurrentToken
.
Kind
==
SyntaxKind
.
SemicolonToken
;
// for empty body accessors w/ missing keyword
||
this
.
CurrentToken
.
Kind
==
SyntaxKind
.
SemicolonToken
// for empty body accessors w/ missing keyword
)
{
return
true
;
}
return
IsPossibleAccessorModifier
();
}
private
bool
IsPossibleAccessorModifier
()
{
// We only want to accept a modifier as the start of an accessor if the modifiers are
// actually followed by "get/set/add/remove". Otherwise, we might thing think we're
// starting an accessor when we're actually starting a normal class member. For example:
//
// class C {
// public int Prop { get { this.
// private DateTime x;
//
// We don't want to think of the "private" in "private int prop" as starting an accessor
// here. If we do, we'll get totally thrown off in parsing the remainder and that will
// throw off the rest of the features that depend on a good syntax tree.
if
(
IsPossibleModifier
())
{
var
peekIndex
=
1
;
while
(
IsPossibleModifier
(
this
.
PeekToken
(
peekIndex
)))
{
peekIndex
++;
}
var
token
=
this
.
PeekToken
(
peekIndex
);
switch
(
token
.
ContextualKind
)
{
case
SyntaxKind
.
GetKeyword
:
case
SyntaxKind
.
SetKeyword
:
case
SyntaxKind
.
AddKeyword
:
case
SyntaxKind
.
RemoveKeyword
:
return
true
;
}
}
return
false
;
}
private
enum
PostSkipAction
...
...
src/EditorFeatures/CSharpTest/Completion/CompletionProviders/SymbolCompletionProviderTests.cs
浏览文件 @
9193aee7
...
...
@@ -8350,5 +8350,22 @@ class C
"
;
VerifyNoItemsExist
(
markup
);
}
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
Completion
)]
public
void
CompletionInIncompletePropertyDeclaration
()
{
var
markup
=
@"
class Class1
{
public string Property1 { get; set; }
}
class Class2
{
public string Property { get { return this.Source.$$
public Class1 Source { get; set; }
}"
;
VerifyAnyItemExists
(
markup
);
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录