in src/classpath/classpathConfigurationView.ts [397:450]
async function getProjectClasspathFromLS(uri: vscode.Uri): Promise<ClasspathComponent> {
const queryKeys: string[] = [
SOURCE_PATH_KEY,
OUTPUT_PATH_KEY,
REFERENCED_LIBRARIES_KEY
];
const response = await lsApi!.getProjectSettings(
uri.toString(),
queryKeys
);
const classpath: ClasspathComponent = {
projectType: await getProjectType(uri.fsPath),
sourcePaths: response[SOURCE_PATH_KEY] as string[],
defaultOutputPath: response[OUTPUT_PATH_KEY] as string,
referenceLibraries: response[REFERENCED_LIBRARIES_KEY] as string[],
};
const baseFsPath = uri.fsPath;
classpath.sourcePaths = classpath.sourcePaths.map(p => {
const relativePath: string = path.relative(baseFsPath, p);
if (!relativePath) {
return ".";
}
return relativePath;
}).sort((srcA: string, srcB: string) => {
return srcA.localeCompare(srcB);
});
const outputRelativePath: string = path.relative(baseFsPath, classpath.defaultOutputPath);
if (!outputRelativePath.startsWith("..")) {
classpath.defaultOutputPath = path.relative(baseFsPath, classpath.defaultOutputPath);
}
classpath.referenceLibraries = classpath.referenceLibraries.map(p => {
const normalizedPath: string = vscode.Uri.file(p).fsPath;
if (normalizedPath.startsWith(baseFsPath)) {
return path.relative(baseFsPath, normalizedPath);
}
return normalizedPath;
}).sort((libA: string, libB: string) => {
// relative paths come first
const isAbsolutePathForA: boolean = path.isAbsolute(libA);
const isAbsolutePathForB: boolean = path.isAbsolute(libB);
if (isAbsolutePathForA && !isAbsolutePathForB) {
return 1;
} else if (!isAbsolutePathForA && isAbsolutePathForB) {
return -1;
} else {
return libA.localeCompare(libB);
}
});
return classpath;
}