Skip to content

Commit 34c8d19

Browse files
Takbamboo
authored andcommitted
Add limited completion support.
1 parent 027592e commit 34c8d19

File tree

5 files changed

+142
-6
lines changed

5 files changed

+142
-6
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
namespace UnityScript.MonoDevelop.Completion
2+
3+
import UnityScript
4+
5+
import Boo.Lang.Compiler
6+
import Boo.Lang.Compiler.Steps
7+
import Boo.Lang.Compiler.Ast
8+
import Boo.Lang.Compiler.IO
9+
import Boo.Lang.Compiler.TypeSystem
10+
11+
class CompletionFinder(DepthFirstVisitor):
12+
13+
public static final CompletionToken = "__complete_me__"
14+
15+
_type as IType
16+
17+
def FindCompletionTypeFor(node as Node):
18+
VisitAllowingCancellation(node)
19+
return _type
20+
21+
override def LeaveMemberReferenceExpression(node as MemberReferenceExpression):
22+
if node.Name != CompletionToken:
23+
return
24+
25+
Found(node.Target.ExpressionType)
26+
27+
protected def Found(type):
28+
_type = type
29+
Cancel()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
namespace UnityScript.MonoDevelop.Completion
2+
3+
import UnityScript
4+
5+
import Boo.Lang.Compiler
6+
import Boo.Lang.Compiler.Steps
7+
import Boo.Lang.Compiler.Ast
8+
import Boo.Lang.Compiler.IO
9+
import Boo.Lang.Compiler.TypeSystem
10+
11+
class ResolveMonoBehaviourType(AbstractCompilerStep):
12+
override def Run():
13+
type = FindReferencedType("UnityEngine.MonoBehaviour")
14+
(Parameters as UnityScriptCompilerParameters).ScriptBaseType = type or object
15+
16+
def FindReferencedType(typeName as string):
17+
for reference in Parameters.References:
18+
assemblyRef = reference as Boo.Lang.Compiler.TypeSystem.Reflection.IAssemblyReference
19+
if assemblyRef is null:
20+
continue
21+
type = assemblyRef.Assembly.GetType(typeName)
22+
if type is not null:
23+
return type

src/UnityScript.MonoDevelop/Completion/UnityScriptEditorCompletion.boo

+43-6
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,36 @@
11
namespace UnityScript.MonoDevelop.Completion
22

3+
import System.Collections.Generic
4+
5+
import UnityScript
36
import UnityScript.MonoDevelop
47
import UnityScript.MonoDevelop.ProjectModel
58

9+
import MonoDevelop.Core
10+
import MonoDevelop.Projects
611
import MonoDevelop.Projects.Dom.Parser
712
import MonoDevelop.Ide.Gui.Content
813
import MonoDevelop.Ide.CodeCompletion
914

15+
import Boo.Lang.Compiler
16+
import Boo.Lang.Compiler.Steps
17+
import Boo.Lang.Compiler.Ast
18+
import Boo.Lang.Compiler.IO
19+
import Boo.Lang.Compiler.TypeSystem
1020
import Boo.Lang.PatternMatching
1121

1222
class UnityScriptEditorCompletion(CompletionTextEditorExtension):
1323

1424
_dom as ProjectDom
25+
_resolver as UnityScriptTypeResolver
26+
_project as DotNetProject
1527

1628
override def Initialize():
1729
super()
1830
_dom = ProjectDomService.GetProjectDom(Document.Project) or ProjectDomService.GetFileDom(Document.FileName)
1931
InstallUnityScriptSyntaxModeIfNeeded()
32+
_resolver = UnityScriptTypeResolver()
33+
_project = Document.Project as DotNetProject
2034

2135
def InstallUnityScriptSyntaxModeIfNeeded():
2236
view = Document.GetContent[of MonoDevelop.SourceEditor.SourceEditorView]()
@@ -29,7 +43,7 @@ class UnityScriptEditorCompletion(CompletionTextEditorExtension):
2943
if mode is not null:
3044
view.Document.SyntaxMode = mode
3145
else:
32-
MonoDevelop.Core.LoggingService.LogWarning(GetType() + " could not get SyntaxMode for mimetype '" + mimeType + "'.")
46+
LoggingService.LogWarning(GetType() + " could not get SyntaxMode for mimetype '" + mimeType + "'.")
3347

3448
override def ExtendsEditor(doc as MonoDevelop.Ide.Gui.Document, editor as IEditableTextBuffer):
3549
return IsUnityScriptFile(doc.Name)
@@ -46,12 +60,35 @@ class UnityScriptEditorCompletion(CompletionTextEditorExtension):
4660
return ImportCompletionDataFor('')
4761

4862
case '.':
49-
lineText = GetLineText(context.TriggerLine)
50-
if not lineText.StartsWith("import "):
51-
return null
63+
# lineText = GetLineText(context.TriggerLine)
64+
# if not lineText.StartsWith("import "):
65+
# return null
66+
67+
# nameSpace = lineText[len("import "):context.TriggerLineOffset-2].Trim()
68+
# return ImportCompletionDataFor(nameSpace)
69+
result = null as CompletionDataList
70+
text = string.Format ("{0}{1} {2}", Document.TextEditor.GetText (0, context.TriggerOffset),
71+
CompletionFinder.CompletionToken,
72+
Document.TextEditor.GetText (context.TriggerOffset, Document.TextEditor.TextLength))
73+
print text
74+
_resolver.Input.Clear()
75+
_resolver.Input.Add(StringInput("completion text", text))
76+
77+
ast = _resolver.Run()
78+
print ast.ToCodeString()
5279

53-
nameSpace = lineText[len("import "):context.TriggerLineOffset-2].Trim()
54-
return ImportCompletionDataFor(nameSpace)
80+
finder = CompletionFinder()
81+
type = finder.FindCompletionTypeFor(ast)
82+
print type
83+
if (null != type):
84+
result = CompletionDataList()
85+
resultHash = Dictionary[of string,string]()
86+
for member in type.GetMembers():
87+
print member
88+
resultHash[member.Name] = member.Name
89+
result.AddRange(resultHash.Keys)
90+
91+
return result
5592

5693
otherwise:
5794
return null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
namespace UnityScript.MonoDevelop.Completion
2+
3+
import UnityScript
4+
5+
import Boo.Lang.Compiler
6+
import Boo.Lang.Compiler.Steps
7+
import Boo.Lang.Compiler.Ast
8+
import Boo.Lang.Compiler.IO
9+
import Boo.Lang.Compiler.TypeSystem
10+
11+
class UnityScriptTypeResolver:
12+
13+
_compiler = UnityScriptCompiler()
14+
15+
def constructor():
16+
pipeline = UnityScriptCompiler.Pipelines.AdjustBooPipeline(Boo.Lang.Compiler.Pipelines.Compile())
17+
pipeline.InsertAfter(UnityScript.Steps.Parse, ResolveMonoBehaviourType())
18+
pipeline.BreakOnErrors = false
19+
20+
_compiler.Parameters.ScriptMainMethod = "Awake"
21+
_compiler.Parameters.Pipeline = pipeline
22+
imports = _compiler.Parameters.Imports
23+
imports.Add("UnityEngine")
24+
imports.Add("System.Collections")
25+
26+
Input:
27+
get: return Parameters.Input
28+
29+
References:
30+
get: return Parameters.References
31+
32+
Parameters:
33+
private get: return _compiler.Parameters
34+
35+
def AddReference(reference as string):
36+
References.Add(Parameters.LoadAssembly(reference, true))
37+
38+
def Run():
39+
result = _compiler.Run()
40+
for error in result.Errors:
41+
print error
42+
return result.CompileUnit

src/UnityScript.MonoDevelop/UnityScript.MonoDevelop.booproj

+5
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,15 @@
5858
<Compile Include="ProjectModel\UnityScriptParser.boo" />
5959
<Compile Include="ProjectModel\UnityScriptProjectParameters.boo" />
6060
<Compile Include="CommandHandlers\withAtomicUndoOn.boo" />
61+
<Compile Include="Completion\ResolveMonoBehaviourType.boo" />
62+
<Compile Include="Completion\CompletionFinder.boo" />
6163
</ItemGroup>
6264
<ProjectExtensions>
6365
<MonoDevelop>
6466
<Properties InternalTargetFrameworkVersion="3.5" />
6567
</MonoDevelop>
6668
</ProjectExtensions>
69+
<ItemGroup>
70+
<None Include="Completion\UnityScriptTypeResolver.boo" />
71+
</ItemGroup>
6772
</Project>

0 commit comments

Comments
 (0)