Skip to content
This repository was archived by the owner on Jul 7, 2025. It is now read-only.

Commit 201ca6d

Browse files
committed
Begin work on tests
1 parent 794f5f5 commit 201ca6d

File tree

29 files changed

+895
-137
lines changed

29 files changed

+895
-137
lines changed

bundles/com.salesforce.bazel.eclipse.core/.classpath

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<classpath>
3-
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
3+
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21">
44
<attributes>
55
<attribute name="module" value="true"/>
66
</attributes>

bundles/com.salesforce.bazel.eclipse.core/.settings/org.eclipse.jdt.core.prefs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
eclipse.preferences.version=1
22
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
33
org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
4-
org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
4+
org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
55
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
6-
org.eclipse.jdt.core.compiler.compliance=17
6+
org.eclipse.jdt.core.compiler.compliance=21
77
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
88
org.eclipse.jdt.core.compiler.debug.localVariable=generate
99
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -12,7 +12,7 @@ org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
1212
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
1313
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
1414
org.eclipse.jdt.core.compiler.release=enabled
15-
org.eclipse.jdt.core.compiler.source=17
15+
org.eclipse.jdt.core.compiler.source=21
1616
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
1717
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
1818
org.eclipse.jdt.core.formatter.align_selector_in_method_invocation_on_expression_first_line=true

bundles/com.salesforce.bazel.eclipse.core/META-INF/MANIFEST.MF

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,5 @@ Require-Bundle: org.eclipse.core.jobs;bundle-version="3.12.0",
5454
org.eclipse.jdt.junit.core;bundle-version="3.11.0",
5555
org.eclipse.core.filesystem;bundle-version="1.9.500",
5656
org.eclipse.core.variables;bundle-version="3.6.0"
57-
Bundle-RequiredExecutionEnvironment: JavaSE-17
57+
Bundle-RequiredExecutionEnvironment: JavaSE-21
5858
Bundle-ActivationPolicy: lazy

bundles/com.salesforce.bazel.eclipse.core/plugin.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@
124124
class="com.salesforce.bazel.eclipse.core.model.discovery.BazelBuildfileTargetDiscovery"
125125
name="buildfiles">
126126
</targetDiscoveryStrategy>
127+
<targetProvisioningStrategy
128+
class="com.salesforce.bazel.eclipse.core.model.discovery.BuildfileDrivenProvisioningStrategy"
129+
name="project-per-buildfile">
130+
</targetProvisioningStrategy>
127131
<targetProvisioningStrategy
128132
class="com.salesforce.bazel.eclipse.core.model.discovery.BuildFileAndVisibilityDrivenProvisioningStrategy"
129133
name="build-file-and-visibility-driven">

bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelModel.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
*/
1414
package com.salesforce.bazel.eclipse.core.model;
1515

16+
import static java.util.Objects.requireNonNull;
17+
1618
import java.util.List;
1719

1820
import org.eclipse.core.resources.IProject;
@@ -105,7 +107,9 @@ public IPath getLocation() {
105107
* @return the owning model manager
106108
*/
107109
public BazelModelManager getModelManager() {
108-
return modelManager;
110+
return requireNonNull(
111+
modelManager,
112+
"not initialized properly; allowed only in unit tests, then mocking is required");
109113
}
110114

111115
@Override

bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/discovery/BaseProvisioningStrategy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1655,7 +1655,7 @@ private void linkSourceFilesWithoutCommonRoot(JavaSourceInfo sourceInfo, IFolder
16551655
Set<IFile> linkedFiles = new HashSet<>();
16561656
for (JavaSourceEntry fileEntry : files) {
16571657
// peek at Java package to find proper "root"
1658-
var packagePath = fileEntry.getDetectedPackagePath();
1658+
var packagePath = fileEntry.hasDetectedPackagePath() ? fileEntry.getDetectedPackagePath() : IPath.EMPTY;
16591659
var packageFolder = virtualSourceFolder.getFolder(packagePath);
16601660
if (!packageFolder.exists()) {
16611661
createFolderAndParents(packageFolder, monitor.split(1));

bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/discovery/analyzers/starlark/StarlarkAnalyzeInfo.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@
2626
import net.starlark.java.eval.Sequence;
2727
import net.starlark.java.eval.Starlark;
2828
import net.starlark.java.eval.StarlarkInt;
29+
import net.starlark.java.eval.StarlarkValue;
2930

3031
/**
3132
* A data type for returning information from the <code>analyze</code> function
3233
*/
3334
@StarlarkBuiltin(name = "AnalyzeInfo", documented = false)
34-
public class StarlarkAnalyzeInfo {
35+
public class StarlarkAnalyzeInfo implements StarlarkValue {
3536

3637
private List<String> convertToStringList(Sequence<?> exclude, String nameForErrorMessage) throws EvalException {
3738
List<String> stringList = new ArrayList<>();
@@ -54,12 +55,11 @@ private List<String> convertToStringList(Sequence<?> exclude, String nameForErro
5455
@ParamType(type = Sequence.class, generic1 = String.class) }, defaultValue = "[]", named = true, documented = false),
5556
@Param(name = "exclude_directories", defaultValue = "1", named = true, documented = false),
5657
@Param(name = "allow_empty", defaultValue = "unbound", named = true, documented = false) })
57-
StarlarkGlobInfo glob(Sequence<?> include, Sequence<?> exclude, StarlarkInt excludeDirectories, Object allowEmpty)
58-
throws EvalException, InterruptedException {
58+
StarlarkGlobInfo ProjectInfo(Sequence<?> include, Sequence<?> exclude, StarlarkInt excludeDirectories,
59+
Object allowEmpty) throws EvalException, InterruptedException {
5960

6061
var includeStringList = convertToStringList(include, "include");
6162
var excludeStringList = convertToStringList(exclude, "exclude");
6263
return new StarlarkGlobInfo(new GlobInfo(includeStringList, excludeStringList));
63-
6464
}
6565
}

bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/discovery/analyzers/starlark/StarlarkFunctionCallInfo.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class StarlarkFunctionCallInfo implements StarlarkValue {
5151
private static final Logger LOG = LoggerFactory.getLogger(StarlarkFunctionCallInfo.class);
5252

5353
private final FunctionCall functionCall;
54+
private volatile Dict<String, Object> args;
5455

5556
public StarlarkFunctionCallInfo(FunctionCall functionCall) {
5657
this.functionCall = functionCall;
@@ -84,7 +85,11 @@ private Dict<String, Object> evaluateArgs(StarlarkThread thread) {
8485

8586
@StarlarkMethod(name = "args", structField = true, useStarlarkThread = true)
8687
public Dict<String, Object> getArgs(StarlarkThread thread) {
87-
return evaluateArgs(thread);
88+
var args = this.args;
89+
if (args != null) {
90+
return args;
91+
}
92+
return this.args = evaluateArgs(thread);
8893
}
8994

9095
@StarlarkMethod(name = "resolved_function_name", structField = true)

bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/discovery/analyzers/starlark/StarlarkMacroCallAnalyzer.java

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -64,22 +64,25 @@
6464
*/
6565
public class StarlarkMacroCallAnalyzer implements MacroCallAnalyzer {
6666

67+
private static final String FUNCTION_INFO = "function_info";
68+
6769
private static final StarlarkSemantics starlarkSemantics =
6870
StarlarkSemantics.builder().setBool(StarlarkSemantics.EXPERIMENTAL_ENABLE_STARLARK_SET, true).build();
6971

70-
private final IPath analyzeFile;
71-
private final StarlarkFunction analyzeFunction;
72-
73-
public StarlarkMacroCallAnalyzer(BazelWorkspace bazelWorkspace, WorkspacePath bzlFile)
72+
/**
73+
* Parses the given input for an <code>'analyze'</code> function.
74+
*
75+
* @param input
76+
* the input to parse
77+
* @param file
78+
* for error reporting only
79+
* @return the parsed function (never <code>null</code>)
80+
* @throws CoreException,
81+
* {@link OperationCanceledException}
82+
*/
83+
/* for test only */
84+
static StarlarkFunction parseInputAndGetAnalyzeFunction(ParserInput input, String file)
7485
throws CoreException, OperationCanceledException {
75-
analyzeFile = bazelWorkspace.getLocation().append(bzlFile.relativePath());
76-
ParserInput input;
77-
try {
78-
input = ParserInput.readFile(analyzeFile.toOSString());
79-
} catch (IOException e) {
80-
throw new CoreException(Status.error(format("Failed to read file '%s'", analyzeFile), e));
81-
}
82-
8386
try (var mu = Mutability.create("analyzer")) {
8487
ImmutableMap.Builder<String, Object> env = ImmutableMap.builder();
8588
//Starlark.addMethods(env, new CqueryDialectGlobals(), starlarkSemantics);
@@ -89,41 +92,68 @@ public StarlarkMacroCallAnalyzer(BazelWorkspace bazelWorkspace, WorkspacePath bz
8992
Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
9093
var analyzeFn = module.getGlobal("analyze");
9194
if (analyzeFn == null) {
92-
throw new CoreException(
93-
Status.error(format("File '%s' does not define 'analyze' function", analyzeFile)));
95+
throw new CoreException(Status.error(format("File '%s' does not define 'analyze' function", file)));
9496
}
95-
if (!(analyzeFn instanceof StarlarkFunction)) {
97+
if (!(analyzeFn instanceof StarlarkFunction analyzeFunction)) {
9698
throw new CoreException(
9799
Status.error(
98100
format(
99101
"File '%s' 'analyze' is not a function. Got '%s'.",
100-
analyzeFile,
102+
file,
101103
Starlark.type(analyzeFn))));
102104
}
103-
analyzeFunction = (StarlarkFunction) analyzeFn;
104-
if (analyzeFunction.getParameterNames().size() != 1) {
105+
if (!analyzeFunction.getParameterNames().contains(FUNCTION_INFO)
106+
|| (analyzeFunction.getParameterNames().size() != 1)) {
105107
throw new CoreException(
106-
Status.error(format("File '%s' 'format' function must take exactly 1 argument", analyzeFile)));
108+
Status.error(
109+
format(
110+
"File '%s' 'analyze' function must take exactly 1 named argument 'function_info'",
111+
file)));
107112
}
113+
114+
return analyzeFunction;
108115
} catch (SyntaxError.Exception e) {
109-
throw new CoreException(
110-
Status.error(format("Syntax error in file '%s': %s", analyzeFile, e.getMessage()), e));
116+
throw new CoreException(Status.error(format("Syntax error in file '%s': %s", file, e.getMessage()), e));
111117
} catch (EvalException e) {
112-
throw new CoreException(
113-
Status.error(format("Evaluation error in file '%s': %s", analyzeFile, e.getMessage()), e));
118+
throw new CoreException(Status.error(format("Evaluation error in file '%s': %s", file, e.getMessage()), e));
114119
} catch (InterruptedException e) {
115120
throw new OperationCanceledException("Interrupted while executing Starlark");
116121
}
117122
}
118123

124+
private final IPath analyzeFile;
125+
126+
private final StarlarkFunction analyzeFunction;
127+
128+
public StarlarkMacroCallAnalyzer(BazelWorkspace bazelWorkspace, WorkspacePath bzlFile)
129+
throws CoreException, OperationCanceledException {
130+
131+
analyzeFile = bazelWorkspace.getLocation().append(bzlFile.relativePath());
132+
133+
ParserInput input;
134+
try {
135+
input = ParserInput.readFile(analyzeFile.toOSString());
136+
} catch (IOException e) {
137+
throw new CoreException(Status.error(format("Failed to read file '%s'", analyzeFile), e));
138+
}
139+
140+
analyzeFunction = parseInputAndGetAnalyzeFunction(input, analyzeFile.toOSString());
141+
}
142+
119143
@Override
120144
public boolean analyze(FunctionCall macroCall, JavaProjectInfo javaInfo) throws CoreException {
121145
try {
122146
var thread = StarlarkThread.createTransient(Mutability.create("analyze evaluation"), starlarkSemantics);
123147
thread.setMaxExecutionSteps(500_000L);
124148

125-
var kwargs = Map.<String, Object> of("macro_info", new StarlarkFunctionCallInfo(macroCall));
149+
var kwargs = Map.<String, Object> of(FUNCTION_INFO, new StarlarkFunctionCallInfo(macroCall));
126150
var result = Starlark.call(thread, analyzeFunction, null, kwargs);
151+
if (Starlark.isNullOrNone(result) || !Starlark.truth(result)) {
152+
return false;
153+
}
154+
if (!(result instanceof StarlarkAnalyzeInfo)) {
155+
throw Starlark.errorf("Return value is not of type AnalyzeInfo. Got '%s'", result);
156+
}
127157
} catch (EvalException e) {
128158
throw new CoreException(
129159
Status.error(

bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/discovery/analyzers/starlark/StarlarkNativeModuleApiDummy.java

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@
1313
*/
1414
package com.salesforce.bazel.eclipse.core.model.discovery.analyzers.starlark;
1515

16-
import java.util.ArrayList;
17-
import java.util.List;
18-
1916
import com.salesforce.bazel.eclipse.core.model.buildfile.GlobInfo;
2017

2118
import net.starlark.java.annot.Param;
@@ -24,7 +21,6 @@
2421
import net.starlark.java.annot.StarlarkMethod;
2522
import net.starlark.java.eval.EvalException;
2623
import net.starlark.java.eval.Sequence;
27-
import net.starlark.java.eval.Starlark;
2824
import net.starlark.java.eval.StarlarkInt;
2925

3026
/**
@@ -33,17 +29,6 @@
3329
@StarlarkBuiltin(name = "native", documented = false)
3430
public class StarlarkNativeModuleApiDummy {
3531

36-
private List<String> convertToStringList(Sequence<?> exclude, String nameForErrorMessage) throws EvalException {
37-
List<String> stringList = new ArrayList<>();
38-
for (Object value : exclude) {
39-
if (!(value instanceof String s)) {
40-
throw Starlark.errorf("Invalid 'glob' argument type in '%s': %s", nameForErrorMessage, value);
41-
}
42-
stringList.add(s);
43-
}
44-
return stringList;
45-
}
46-
4732
/**
4833
* Support for <code>glob</code> to turn into {@link StarlarkGlobInfo}.
4934
*
@@ -56,12 +41,8 @@ private List<String> convertToStringList(Sequence<?> exclude, String nameForErro
5641
@ParamType(type = Sequence.class, generic1 = String.class) }, defaultValue = "[]", named = true, documented = false),
5742
@Param(name = "exclude_directories", defaultValue = "1", named = true, documented = false),
5843
@Param(name = "allow_empty", defaultValue = "unbound", named = true, documented = false) })
59-
StarlarkGlobInfo glob(Sequence<?> include, Sequence<?> exclude, StarlarkInt excludeDirectories, Object allowEmpty)
60-
throws EvalException, InterruptedException {
61-
62-
var includeStringList = convertToStringList(include, "include");
63-
var excludeStringList = convertToStringList(exclude, "exclude");
64-
return new StarlarkGlobInfo(new GlobInfo(includeStringList, excludeStringList));
65-
44+
StarlarkGlobInfo glob(Sequence<String> include, Sequence<String> exclude, StarlarkInt excludeDirectories,
45+
Object allowEmpty) throws EvalException, InterruptedException {
46+
return new StarlarkGlobInfo(new GlobInfo(include, exclude));
6647
}
6748
}

0 commit comments

Comments
 (0)