Skip to content

Commit 5cb1d6b

Browse files
committed
support source tag
1 parent f08d933 commit 5cb1d6b

File tree

12 files changed

+90
-0
lines changed

12 files changed

+90
-0
lines changed

EmmyLua/CodeAnalysis/Compilation/Analyzer/DeclarationAnalyzer/AttachDeclarationAnalyzer.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ private void AnalyzeGeneralDeclaration(LuaSyntaxElement attachedElement, List<Lu
7373
declarationContext.Db.AddMapping(declaration.UniqueId, name);
7474
}
7575

76+
break;
77+
}
78+
case LuaDocTagSourceSyntax sourceSyntax:
79+
{
80+
if (sourceSyntax.Source is { Value: { } source })
81+
{
82+
declaration.Feature |= SymbolFeature.Source;
83+
declarationContext.Db.AddSource(declaration.UniqueId, source);
84+
}
85+
7686
break;
7787
}
7888
}

EmmyLua/CodeAnalysis/Compilation/Analyzer/DeclarationAnalyzer/DeclarationWalker/DeclarationWalker.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,11 @@ public void WalkIn(LuaSyntaxElement node)
193193
AnalyzeTagUsing(usingSyntax);
194194
break;
195195
}
196+
case LuaDocTagSourceSyntax sourceSyntax:
197+
{
198+
AnalyzeTagSource(sourceSyntax);
199+
break;
200+
}
196201
}
197202
}
198203

EmmyLua/CodeAnalysis/Compilation/Analyzer/DeclarationAnalyzer/DeclarationWalker/TagDocWalker.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,11 @@ private void AnalyzeTagUsing(LuaDocTagUsingSyntax usingSyntax)
288288
}
289289
}
290290

291+
private void AnalyzeTagSource(LuaDocTagSourceSyntax sourceSyntax)
292+
{
293+
declarationContext.AttachDoc(sourceSyntax);
294+
}
295+
291296
private void AnalyzeSimpleTag(LuaDocTagSyntax tagSyntax)
292297
{
293298
declarationContext.AttachDoc(tagSyntax);

EmmyLua/CodeAnalysis/Compilation/Index/ProjectIndex.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public class ProjectIndex
3131

3232
private Dictionary<LuaDocumentId, LuaDeclarationTree> DocumentDeclarationTrees { get; } = new();
3333

34+
private InFileIndex<SyntaxElementId, string> Source { get; } = new();
35+
3436
private UniqueIndex<SyntaxElementId, string> MappingName { get; } = new();
3537

3638
public void Remove(LuaDocumentId documentId)
@@ -43,6 +45,7 @@ public void Remove(LuaDocumentId documentId)
4345
InFiledReferences.Remove(documentId);
4446
InFiledDeclarations.Remove(documentId);
4547
DocumentDeclarationTrees.Remove(documentId);
48+
Source.Remove(documentId);
4649
}
4750

4851
#region Add
@@ -111,6 +114,11 @@ public void AddTableField(LuaDocumentId documentId, LuaTableFieldSyntax tableFie
111114
}
112115
}
113116

117+
public void AddSource(SyntaxElementId id, string source)
118+
{
119+
Source.Add(id.DocumentId, id, source);
120+
}
121+
114122
#endregion
115123

116124
#region Query
@@ -195,5 +203,10 @@ public IEnumerable<LuaElementPtr<LuaExprSyntax>> QueryModuleReturns(LuaDocumentI
195203
return MappingName.Query(id);
196204
}
197205

206+
public string? QuerySource(SyntaxElementId id)
207+
{
208+
return Source.Query(id);
209+
}
210+
198211
#endregion
199212
}

EmmyLua/CodeAnalysis/Compilation/Symbol/LuaSymbol.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public enum SymbolFeature
2121
Global = 0x04,
2222
NoDiscard = 0x08,
2323
Async = 0x10,
24+
Source = 0x20,
2425
}
2526

2627
public enum SymbolVisibility
@@ -57,6 +58,8 @@ public class LuaSymbol(
5758

5859
public bool IsNoDiscard => Feature.HasFlag(SymbolFeature.NoDiscard);
5960

61+
public bool HasSource => Feature.HasFlag(SymbolFeature.Source);
62+
6063
public SymbolVisibility Visibility { get; internal set; } = visibility;
6164

6265
public bool IsPublic => Visibility == SymbolVisibility.Public;
@@ -132,6 +135,30 @@ public bool ValidateFrameworkVersions(List<FrameworkVersion> versions)
132135

133136
public virtual LuaLocation? GetLocation(SearchContext context)
134137
{
138+
if (HasSource)
139+
{
140+
var source = context.Compilation.Db.QuerySource(UniqueId);
141+
if (source is not null)
142+
{
143+
var parts = source.Split('#');
144+
var uri = string.Empty;
145+
var line = 0;
146+
if (parts.Length == 2)
147+
{
148+
uri = parts[0];
149+
if (!int.TryParse(parts[1], out line))
150+
{
151+
return null;
152+
}
153+
}
154+
155+
if (uri.Length > 0)
156+
{
157+
return new LuaLocation(line, 0, line, 0, uri);
158+
}
159+
}
160+
}
161+
135162
var document = context.Compilation.Project.GetDocument(Info.Ptr.DocumentId);
136163
if (document is not null)
137164
{

EmmyLua/CodeAnalysis/Compile/Grammar/Doc/Tags.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ public static CompleteMarker Tag(LuaDocParser p)
107107
{
108108
return TagUsing(p);
109109
}
110+
case LuaTokenKind.TkTagSource:
111+
{
112+
return TagSource(p);
113+
}
110114
case LuaTokenKind.TkTagMeta:
111115
{
112116
return SimpleTag(p, LuaSyntaxKind.DocMeta);
@@ -794,6 +798,22 @@ private static CompleteMarker TagUsing(LuaDocParser p)
794798
}
795799
}
796800

801+
private static CompleteMarker TagSource(LuaDocParser p)
802+
{
803+
p.SetState(LuaDocLexerState.Normal);
804+
var m = p.Marker();
805+
p.Bump();
806+
try
807+
{
808+
p.Expect(LuaTokenKind.TkString);
809+
return m.Complete(p, LuaSyntaxKind.DocSource);
810+
}
811+
catch (UnexpectedTokenException e)
812+
{
813+
return m.Fail(p, LuaSyntaxKind.DocSource, e.Message);
814+
}
815+
}
816+
797817
private static void ExtensionTypeList(LuaDocParser p)
798818
{
799819
p.Bump();

EmmyLua/CodeAnalysis/Compile/Lexer/LuaDocLexer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ private static LuaTokenKind ToTag(ReadOnlySpan<char> text)
5858
"mapping" => LuaTokenKind.TkTagMapping,
5959
"namespace" => LuaTokenKind.TkTagNamespace,
6060
"using" => LuaTokenKind.TkTagUsing,
61+
"source" => LuaTokenKind.TkTagSource,
6162
_ => LuaTokenKind.TkTagOther
6263
};
6364
}

EmmyLua/CodeAnalysis/Syntax/Kind/LuaSyntaxKind.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public enum LuaSyntaxKind : ushort
7777
DocMapping,
7878
DocNamespace,
7979
DocUsing,
80+
DocSource,
8081

8182
DocDetailField,
8283
DocBody,

EmmyLua/CodeAnalysis/Syntax/Kind/LuaTokenKind.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ public enum LuaTokenKind : ushort
114114
TkTagMapping, // mapping
115115
TkTagNamespace, // namespace
116116
TkTagUsing, // using
117+
TkTagSource, // source
117118

118119
TkDocOr, // |
119120
TkDocContinue, // ---

EmmyLua/CodeAnalysis/Syntax/Node/SyntaxFactory.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public static LuaSyntaxElement CreateSyntax(int index, LuaSyntaxTree tree)
7474
LuaSyntaxKind.DocMapping => new LuaDocTagMappingSyntax(index, tree),
7575
LuaSyntaxKind.DocNamespace => new LuaDocTagNamespaceSyntax(index, tree),
7676
LuaSyntaxKind.DocUsing => new LuaDocTagUsingSyntax(index, tree),
77+
LuaSyntaxKind.DocSource => new LuaDocTagSourceSyntax(index, tree),
7778
LuaSyntaxKind.TypeArray => new LuaDocArrayTypeSyntax(index, tree),
7879
LuaSyntaxKind.TypeUnion => new LuaDocUnionTypeSyntax(index, tree),
7980
LuaSyntaxKind.TypeFun => new LuaDocFuncTypeSyntax(index, tree),

0 commit comments

Comments
 (0)