Files
libadalang/extensions/java_api/analysis_context_class
Laurent Thévenoux ca07fe6c69 Adapt Java API to the generic LangkitSupport interface
So that the Libadalang Java API can be used through the genericized
LangkitSupport interface.
2025-06-25 11:45:16 +00:00

74 lines
2.8 KiB
Plaintext

## vim: filetype=makojava
<%
api = java_api
nat = c_api.get_name
%>
${java_doc("libadalang.set_config_pragmas_mapping", 8)}
public void setConfigPragmasMapping(
LangkitSupport.AnalysisUnit globalPragmas,
Map<LangkitSupport.AnalysisUnit, LangkitSupport.AnalysisUnit> localPragmas
) {
final AnalysisUnit castGlobalPragmas = (AnalysisUnit) globalPragmas;
final Map<AnalysisUnit, AnalysisUnit> castLocalPragmas = (Map) localPragmas;
// Create the flat array for local pragmas that the C API expects
AnalysisUnit[] locals;
int i = 0;
int localCount;
if (castLocalPragmas == null) {
localCount = 1;
locals = new AnalysisUnit[localCount];
} else {
localCount = 2 * castLocalPragmas.size() + 1;
locals = new AnalysisUnit[localCount];
for (Map.Entry<AnalysisUnit, AnalysisUnit> entry :
castLocalPragmas.entrySet()) {
AnalysisUnit key = entry.getKey();
AnalysisUnit value = entry.getValue();
if (key == null)
throw new RuntimeException("localPragmas: null key");
if (value == null)
throw new RuntimeException("localPragmas: null value");
locals[i] = key;
locals[i + 1] = value;
i += 2;
}
}
locals[i] = null;
if(ImageInfo.inImageCode()) {
final int unitSize = SizeOf.get(AnalysisUnitNative.class);
final Pointer localPragmasNative = UnmanagedMemory.calloc(
localCount * unitSize
);
for (i = 0; i < localCount; ++i) {
final AnalysisUnitNative u =
locals[i] == null
? WordFactory.nullPointer()
: locals[i].unwrap();
localPragmasNative.writeWord(unitSize * i, u);
}
final AnalysisUnitNative globalPragmasNative =
castGlobalPragmas == null
? WordFactory.nullPointer()
: castGlobalPragmas.unwrap();
NI_LIB.${nat("set_config_pragmas_mapping")}(
this.reference.ni(),
globalPragmasNative,
localPragmasNative
);
} else {
JNI_LIB.${nat("set_config_pragmas_mapping")}(
this,
castGlobalPragmas,
locals
);
}
checkException();
}