Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Store model text in memory #121

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 36 additions & 7 deletions src/main/java/software/amazon/smithy/lsp/SmithyInterface.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collection;
import java.util.Map;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
import software.amazon.smithy.lsp.ext.LspLog;
import software.amazon.smithy.model.Model;
Expand All @@ -43,13 +44,7 @@ private SmithyInterface() {
public static Either<Exception, ValidatedResult<Model>> readModel(Collection<File> files,
Collection<File> externalJars) {
try {
URL[] urls = externalJars.stream().map(SmithyInterface::fileToUrl).toArray(URL[]::new);
URLClassLoader urlClassLoader = new URLClassLoader(urls);
ModelAssembler assembler = Model.assembler(urlClassLoader)
.discoverModels(urlClassLoader)
// We don't want the model to be broken when there are unknown traits,
// because that will essentially disable language server features.
.putProperty(ModelAssembler.ALLOW_UNKNOWN_TRAITS, true);
ModelAssembler assembler = getModelAssembler(externalJars);

for (File file : files) {
assembler.addImport(file.getAbsolutePath());
Expand All @@ -62,6 +57,40 @@ public static Either<Exception, ValidatedResult<Model>> readModel(Collection<Fil
}
}

/**
* Reads in the specified model files, adding external jars to model builder.
*
* @param sources Map of model file URIs to their contents
* @param externalJars set of external jars
* @return either an exception encountered during model building, or the result
* of model building
*/
public static Either<Exception, ValidatedResult<Model>> readModel(
Map<String, String> sources,
Collection<File> externalJars
) {
try {
ModelAssembler assembler = getModelAssembler(externalJars);
for (String uri : sources.keySet()) {
assembler.addUnparsedModel(uri, sources.get(uri));
}
return Either.forRight(assembler.assemble());
} catch (Exception e) {
LspLog.println(e);
return Either.forLeft(e);
}
}

private static ModelAssembler getModelAssembler(Collection<File> externalJars) {
URL[] urls = externalJars.stream().map(SmithyInterface::fileToUrl).toArray(URL[]::new);
URLClassLoader urlClassLoader = new URLClassLoader(urls);
return Model.assembler(urlClassLoader)
.discoverModels(urlClassLoader)
// We don't want the model to be broken when there are unknown traits,
// because that will essentially disable language server features.
.putProperty(ModelAssembler.ALLOW_UNKNOWN_TRAITS, true);
}

private static URL fileToUrl(File file) {
try {
return file.toURI().toURL();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,15 +124,7 @@ public WorkspaceService getWorkspaceService() {

@Override
public TextDocumentService getTextDocumentService() {
File temp = null;
try {
temp = Files.createTempDirectory("smithy-lsp").toFile();
LspLog.println("Created a temporary folder for file contents " + temp);
temp.deleteOnExit();
} catch (IOException e) {
LspLog.println("Failed to create a temporary folder " + e);
}
SmithyTextDocumentService local = new SmithyTextDocumentService(this.client, temp);
SmithyTextDocumentService local = new SmithyTextDocumentService(this.client);
tds = Optional.of(local);
return local;
}
Expand Down
Loading
Loading