Skip to content

Commit a5bf9a7

Browse files
committed
More converted from Kotlin
1 parent 548d3b0 commit a5bf9a7

47 files changed

Lines changed: 1544 additions & 1144 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
## [0.2.2] - 2026-06-04
1515
- `$assert`, `$error` now work with vaargs.
1616
- Updated new file syntax
17-
- Variout fixes to code completion.
17+
- Various fixes to code completion.
1818

1919
## [0.2.1] - 2026-04-21
2020
- 0.8.0 Syntax compatibility
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package org.c3lang.intellij;
2+
3+
import com.intellij.lang.ASTNode;
4+
import com.intellij.lang.Language;
5+
import com.intellij.psi.PsiElement;
6+
import com.intellij.ui.breadcrumbs.BreadcrumbsProvider;
7+
import org.c3lang.intellij.psi.C3AliasDecl;
8+
import org.c3lang.intellij.psi.C3AliasTypeDecl;
9+
import org.c3lang.intellij.psi.C3AttrdefDecl;
10+
import org.c3lang.intellij.psi.C3BitstructDeclaration;
11+
import org.c3lang.intellij.psi.C3BitstructDef;
12+
import org.c3lang.intellij.psi.C3BitstructSimpleDef;
13+
import org.c3lang.intellij.psi.C3EnumDeclaration;
14+
import org.c3lang.intellij.psi.C3FuncDefinition;
15+
import org.c3lang.intellij.psi.C3IdentifierList;
16+
import org.c3lang.intellij.psi.C3InterfaceDefinition;
17+
import org.c3lang.intellij.psi.C3MacroDefinition;
18+
import org.c3lang.intellij.psi.C3StructDeclaration;
19+
import org.c3lang.intellij.psi.C3StructMemberDeclaration;
20+
import org.c3lang.intellij.psi.C3TypedefDecl;
21+
import org.c3lang.intellij.psi.C3Types;
22+
import org.jetbrains.annotations.NotNull;
23+
24+
public class C3BreadcrumbsProvider implements BreadcrumbsProvider
25+
{
26+
@Override
27+
public Language @NotNull [] getLanguages()
28+
{
29+
return new Language[]{C3Language.INSTANCE};
30+
}
31+
32+
@Override
33+
public boolean acceptElement(@NotNull PsiElement element)
34+
{
35+
return element instanceof C3StructDeclaration
36+
|| element instanceof C3BitstructDeclaration
37+
|| element instanceof C3EnumDeclaration
38+
|| element instanceof C3MacroDefinition
39+
|| element instanceof C3FuncDefinition
40+
|| element instanceof C3StructMemberDeclaration
41+
|| element instanceof C3BitstructDef
42+
|| element instanceof C3BitstructSimpleDef
43+
|| element instanceof C3AttrdefDecl
44+
|| element instanceof C3TypedefDecl
45+
|| element instanceof C3AliasDecl;
46+
}
47+
48+
@Override
49+
public @NotNull String getElementInfo(@NotNull PsiElement element)
50+
{
51+
if (element instanceof C3StructDeclaration declaration) return declaration.getTypeName().getText();
52+
if (element instanceof C3EnumDeclaration declaration) return declaration.getTypeName().getText();
53+
if (element instanceof C3MacroDefinition definition) return definition.getMacroHeader().getMacroName().getText();
54+
if (element instanceof C3TypedefDecl declaration) return declaration.getTypeName().getText();
55+
if (element instanceof C3AttrdefDecl declaration) return declaration.getAttributeUserName().getText();
56+
if (element instanceof C3AliasTypeDecl declaration) return declaration.getTypeName().getText();
57+
if (element instanceof C3InterfaceDefinition definition) return definition.getTypeName().getText();
58+
if (element instanceof C3FuncDefinition definition)
59+
{
60+
return definition.getFuncDef().getFuncHeader().getFuncName().getText();
61+
}
62+
if (element instanceof C3BitstructDeclaration declaration) return declaration.getTypeName().getText();
63+
if (element instanceof C3StructMemberDeclaration declaration)
64+
{
65+
C3IdentifierList list = declaration.getIdentifierList();
66+
return list != null ? list.getText() : "anonymous";
67+
}
68+
if (element instanceof C3BitstructDef || element instanceof C3BitstructSimpleDef)
69+
{
70+
ASTNode ident = element.getNode().findChildByType(C3Types.IDENT);
71+
return ident != null ? ident.getText() : "anonymous";
72+
}
73+
return "";
74+
}
75+
}

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

Lines changed: 0 additions & 53 deletions
This file was deleted.

src/main/java/org/c3lang/intellij/C3ColorSettingsPageDemoText.kt renamed to src/main/java/org/c3lang/intellij/C3ColorSettingsPageDemoText.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
@file:JvmName("C3ColorSettingsPageDemoText")
2-
package org.c3lang.intellij
1+
package org.c3lang.intellij;
32

4-
const val DEMO_TEXT = """
3+
public final class C3ColorSettingsPageDemoText
4+
{
5+
public static final String DEMO_TEXT = """
56
module stack <Type>;
67
// Above: the parameterized type is applied to the entire module.
78
89
faultdef FILE_NOT_FOUND, FILE_IS_DIR;
910
10-
fn void fault_example()
11+
fn void fault_example()\s
1112
{
1213
return FILE_NOT_FOUND?;
1314
}
@@ -40,4 +41,7 @@ fn void fault_example()
4041
{
4142
return !this.size;
4243
}
43-
"""
44+
""";
45+
46+
private C3ColorSettingsPageDemoText() {}
47+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package org.c3lang.intellij;
2+
3+
import com.intellij.openapi.editor.ElementColorProvider;
4+
import com.intellij.psi.PsiElement;
5+
import com.intellij.psi.PsiFile;
6+
import com.intellij.psi.PsiFileFactory;
7+
import com.intellij.ui.JBColor;
8+
import org.c3lang.intellij.psi.C3Types;
9+
import org.jetbrains.annotations.NotNull;
10+
import org.jetbrains.annotations.Nullable;
11+
12+
import java.awt.Color;
13+
import java.util.regex.Pattern;
14+
15+
public class C3ElementColorProvider implements ElementColorProvider
16+
{
17+
private static final Pattern COLOR_LITERAL = Pattern.compile("0x([\\dA-Fa-f]{8}|[\\dA-Fa-f]{6})");
18+
private static final Pattern UPPER_HEX = Pattern.compile("[A-F]");
19+
20+
private PsiElement lastElement;
21+
22+
@Override
23+
public @Nullable Color getColorFrom(@NotNull PsiElement element)
24+
{
25+
if (element.getNode().getElementType() != C3Types.INT_LITERAL) return null;
26+
if (!COLOR_LITERAL.matcher(element.getText()).matches()) return null;
27+
28+
String rgba = element.getText().substring(2);
29+
long value = Long.parseLong(rgba, 16);
30+
if (rgba.length() == 6)
31+
{
32+
int rgb = (int) value;
33+
return new JBColor(rgb, rgb);
34+
}
35+
36+
value = ((value & 0xFFFFFF00L) >> 8) + ((value & 0xFFL) << 24);
37+
Color color = new Color((int) value, true);
38+
return new JBColor(color, color);
39+
}
40+
41+
@Override
42+
public void setColorTo(@NotNull PsiElement element, @NotNull Color color)
43+
{
44+
// This workaround is due to https://youtrack.jetbrains.com/issue/IDEA-331607/JavaColorProvider-issues
45+
// Remove when element actually always is the last element.
46+
if (lastElement == null || element.getParent().getParent() != null)
47+
{
48+
lastElement = element;
49+
}
50+
51+
boolean upper = UPPER_HEX.matcher(element.getText()).find();
52+
String text;
53+
if (element.getText().length() == 8)
54+
{
55+
text = String.format(
56+
upper ? "0x%02X%02X%02X" : "0x%02x%02x%02x",
57+
color.getRed(),
58+
color.getGreen(),
59+
color.getBlue()
60+
);
61+
}
62+
else
63+
{
64+
text = String.format(
65+
upper ? "0x%02X%02X%02X%02X" : "0x%02x%02x%02x%02x",
66+
color.getRed(),
67+
color.getGreen(),
68+
color.getBlue(),
69+
color.getAlpha()
70+
);
71+
}
72+
73+
PsiFile file = PsiFileFactory.getInstance(element.getProject()).createFileFromText(
74+
"color_replace.dummy.c3",
75+
C3SourceFileType.INSTANCE,
76+
"int a = " + text + ";"
77+
);
78+
79+
PsiElement newElement = file.getFirstChild()
80+
.getFirstChild()
81+
.getFirstChild()
82+
.getChildren()[1]
83+
.getChildren()[0]
84+
.getFirstChild();
85+
86+
PsiElement parent = lastElement.getParent();
87+
lastElement.replace(newElement);
88+
lastElement = parent.getFirstChild();
89+
}
90+
}

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

Lines changed: 0 additions & 50 deletions
This file was deleted.
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package org.c3lang.intellij;
2+
3+
import com.intellij.codeInsight.daemon.LineMarkerInfo;
4+
import com.intellij.codeInsight.daemon.LineMarkerProvider;
5+
import com.intellij.execution.RunManager;
6+
import com.intellij.execution.configurations.ConfigurationFactory;
7+
import com.intellij.execution.configurations.ConfigurationTypeUtil;
8+
import com.intellij.execution.executors.DefaultRunExecutor;
9+
import com.intellij.execution.runners.ExecutionEnvironment;
10+
import com.intellij.execution.runners.ExecutionEnvironmentBuilder;
11+
import com.intellij.icons.AllIcons;
12+
import com.intellij.openapi.editor.markup.GutterIconRenderer;
13+
import com.intellij.openapi.project.Project;
14+
import com.intellij.psi.PsiElement;
15+
import com.intellij.execution.ExecutionException;
16+
import org.c3lang.intellij.psi.C3FuncDefinition;
17+
import org.jetbrains.annotations.Nullable;
18+
19+
public class C3LineMarkerProvider implements LineMarkerProvider
20+
{
21+
@Override
22+
public @Nullable LineMarkerInfo<?> getLineMarkerInfo(PsiElement element)
23+
{
24+
if (!(element instanceof C3FuncDefinition function)) return null;
25+
26+
String type = function.getFuncDef().getFuncHeader().getOptionalType().getType().getText();
27+
String name = function.getFuncDef().getFqName().getName();
28+
29+
if (!name.equals("main")) return null;
30+
if (!type.equals("int") && !type.equals("void")) return null;
31+
32+
return new LineMarkerInfo<>(
33+
element,
34+
element.getTextRange(),
35+
AllIcons.Actions.Execute,
36+
ignored -> "Run main",
37+
(event, elt) -> createAndRunCustomConfig(elt.getProject()),
38+
GutterIconRenderer.Alignment.RIGHT,
39+
() -> "Click to open context menu"
40+
);
41+
}
42+
43+
private static void createAndRunCustomConfig(Project project)
44+
{
45+
RunManager runManager = RunManager.getInstance(project);
46+
C3BuildRunConfigurationType configType =
47+
ConfigurationTypeUtil.findConfigurationType(C3BuildRunConfigurationType.class);
48+
ConfigurationFactory factory = configType.getConfigurationFactories()[0];
49+
var settings = runManager.createConfiguration("main", factory);
50+
C3BuildRunConfiguration config = (C3BuildRunConfiguration) settings.getConfiguration();
51+
52+
config.setWorkingDirectory(project.getBasePath());
53+
config.setArgs("");
54+
55+
runManager.addConfiguration(settings);
56+
runManager.setSelectedConfiguration(settings);
57+
58+
var executor = DefaultRunExecutor.getRunExecutorInstance();
59+
try
60+
{
61+
ExecutionEnvironment environment = ExecutionEnvironmentBuilder.create(executor, settings).build();
62+
environment.getRunner().execute(environment);
63+
}
64+
catch (ExecutionException e)
65+
{
66+
throw new RuntimeException(e);
67+
}
68+
}
69+
}

0 commit comments

Comments
 (0)