Skip to content

Commit e7dd9d4

Browse files
authored
Multiple Completion Bug Fixes (#34)
* Squashed commit of the following: commit 384be64 Author: Zee Vasilyev <[email protected]> Date: Wed Aug 13 16:27:03 2025 -0500 Removed unused import commit b5d44c5 Author: Zee Vasilyev <[email protected]> Date: Wed Aug 13 15:20:34 2025 -0500 Fixed import completions not working * Squashed commit of the following: commit 867a2f0 Author: Zee Vasilyev <[email protected]> Date: Wed Aug 13 11:49:09 2025 -0500 removed fault and def; added faultdef, typedef, and alias * Squashed commit of the following: commit 5f74b70 Author: Zee Vasilyev <[email protected]> Date: Wed Aug 13 17:08:44 2025 -0500 Implemented an C3StdLibRootsProvider so that the STD lib is indexed and provide completion
1 parent 2782bb2 commit e7dd9d4

File tree

5 files changed

+57
-13
lines changed

5 files changed

+57
-13
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.c3lang.intellij;
2+
3+
import com.intellij.openapi.project.Project;
4+
import com.intellij.openapi.roots.AdditionalLibraryRootsProvider;
5+
import com.intellij.openapi.roots.SyntheticLibrary;
6+
import com.intellij.openapi.vfs.LocalFileSystem;
7+
import com.intellij.openapi.vfs.VirtualFile;
8+
import org.jetbrains.annotations.NotNull;
9+
10+
import java.util.Collection;
11+
import java.util.Collections;
12+
13+
public class C3StdLibRootsProvider extends AdditionalLibraryRootsProvider {
14+
@Override
15+
public @NotNull Collection<SyntheticLibrary> getAdditionalProjectLibraries(Project project) {
16+
17+
var settings = C3SettingsState.getInstance();
18+
var stdLibPath = settings.stdlibPath;
19+
20+
VirtualFile stdLibRoot = LocalFileSystem.getInstance().findFileByPath(stdLibPath);
21+
if (stdLibRoot != null) {
22+
return Collections.singletonList(
23+
SyntheticLibrary.newImmutableLibrary(Collections.singletonList(stdLibRoot))
24+
);
25+
}
26+
return Collections.emptyList();
27+
}
28+
}

src/main/java/org/c3lang/intellij/C3Util.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ object C3Util
156156
}
157157

158158
// search stdlib after
159-
File(stdLibPath).walk()
160-
.asSequence()
159+
File(stdLibPath)
160+
.walk()
161161
.filter { file ->
162162
file.isFile && file.extension == "c3"
163163
}

src/main/java/org/c3lang/intellij/completion/ImportCompletionContributor.kt

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@ package org.c3lang.intellij.completion
33
import com.intellij.codeInsight.completion.CompletionParameters
44
import com.intellij.codeInsight.completion.CompletionProvider
55
import com.intellij.codeInsight.completion.CompletionResultSet
6-
import com.intellij.openapi.project.Project
6+
import com.intellij.codeInsight.lookup.LookupElementBuilder
77
import com.intellij.patterns.PlatformPatterns.psiElement
88
import com.intellij.patterns.StandardPatterns.or
99
import com.intellij.util.ProcessingContext
1010
import org.c3lang.intellij.C3Util.findC3ModulesStartingWith
11-
import org.c3lang.intellij.completion.CompletionUtil.provideCompletionsAfterSymbol
1211
import org.c3lang.intellij.psi.C3ImportPath
1312

1413
@Suppress("DuplicatedCode")
@@ -18,18 +17,32 @@ object ImportCompletionContributor : CompletionProvider<CompletionParameters>()
1817

1918
override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet)
2019
{
21-
if (!pattern.accepts(parameters.position) && !pattern.accepts(parameters.originalPosition))
20+
val matches = pattern.accepts(parameters.position)
21+
if (!matches)
2222
{
2323
return
2424
}
2525

26-
val leaf = parameters.originalFile.findElementAt(parameters.offset)?.prevSibling
26+
val position = parameters.position
27+
val packagePathElement = position.parent
2728

28-
provideCompletionsAfterSymbol(parameters, result, "::", getPossibleCompletions(parameters.editor.project!!, leaf?.text ?: "NONE"))
29-
}
29+
// Example: "std::some::dummy"
30+
val fullTextWithDummy = packagePathElement.text
31+
val parentStartOffset = packagePathElement.textRange.startOffset
32+
val caretOffset = parameters.offset
33+
val prefixLength = caretOffset - parentStartOffset
34+
if (prefixLength < 0 || prefixLength > fullTextWithDummy.length) {
35+
return
36+
}
3037

31-
private fun getPossibleCompletions(project: Project, path: String): List<String>
32-
{
33-
return findC3ModulesStartingWith(project, path).toList().map { it.replace(path, "") }
38+
val project = parameters.editor.project!!
39+
val prefix = fullTextWithDummy.take(prefixLength)
40+
val modules = findC3ModulesStartingWith(project, prefix)
41+
42+
val resultSetWithPrefix = result.withPrefixMatcher(prefix)
43+
44+
modules.forEach { module ->
45+
resultSetWithPrefix.addElement(LookupElementBuilder.create(module))
46+
}
3447
}
3548
}

src/main/java/org/c3lang/intellij/completion/TopLevelCompletionContributor.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@ object TopLevelCompletionContributor : CompletionProvider<CompletionParameters>(
3535
listOf(
3636
"fn",
3737
"struct",
38-
"fault",
38+
"faultdef",
3939
"macro",
40-
"def",
40+
"alias",
41+
"typedef",
4142
"module",
4243
"import",
4344
"extern",

src/main/resources/META-INF/plugin.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
<stubIndex implementation="org.c3lang.intellij.index.StructDeclarationIndex"/>
2525
<stubIndex implementation="org.c3lang.intellij.index.StructMemberDeclarationIndex"/>
2626

27+
<additionalLibraryRootsProvider implementation="org.c3lang.intellij.C3StdLibRootsProvider"/>
28+
2729
<fileType name="C3 File" implementationClass="org.c3lang.intellij.C3SourceFileType" fieldName="INSTANCE" language="C3" extensions="c3;c3t"/>
2830
<fileType name="C3 Interface File" implementationClass="org.c3lang.intellij.C3InterfaceFileType" fieldName="INSTANCE" language="C3" extensions="c3i"/>
2931
<!-- <fileType name="C3 Library File" implementationClass="org.c3lang.intellij.C3LibFileType" fieldName="INSTANCE" language="C3" extensions="c3l"/>-->

0 commit comments

Comments
 (0)