package org.simantics.scl.compiler.module; import org.simantics.scl.compiler.elaboration.expressions.EVar; import org.simantics.scl.compiler.internal.parsing.Symbol; import org.simantics.scl.compiler.internal.parsing.declarations.DeclarationAst; public class ImportDeclaration extends DeclarationAst { public static final ImportSpec DEFAULT_SPEC = new ImportSpec(true, new EVar[0]); public static final ImportDeclaration[] EMPTY_ARRAY = new ImportDeclaration[0]; public static final ImportDeclaration[] ONLY_BUILTINS = new ImportDeclaration[] { new ImportDeclaration("Builtin", "") }; public final String moduleName; public final String localName; public final boolean reexport; public final ImportSpec spec; public static class ImportSpec extends Symbol { public final boolean hiding; public final EVar[] values; public ImportSpec(boolean hiding, EVar[] values) { this.hiding = hiding; this.values = values; } @Override public String toString() { if(hiding && values.length == 0) return ""; StringBuilder b = new StringBuilder(); if(hiding) b.append("hiding "); b.append('('); for(int i=0;i 0) b.append(','); b.append(values[i].name); } b.append(')'); return b.toString(); } } public ImportDeclaration(String moduleName, String localName, boolean reexport) { this.moduleName = moduleName; this.localName = localName; this.reexport = reexport; this.spec = DEFAULT_SPEC; } public ImportDeclaration(String moduleName, String localName, boolean reexport, ImportSpec spec) { if(spec == null) throw new NullPointerException(); this.moduleName = moduleName; this.localName = localName; this.reexport = reexport; this.spec = spec; } public ImportDeclaration(String moduleName, String localName) { this(moduleName, localName, false); } @Override public void toString(int indentation, StringBuilder b) { for(int i=0;i