org.snapscript.core.link.DefaultImportReader Maven / Gradle / Ivy
package org.snapscript.core.link;
import java.util.LinkedHashSet;
import java.util.Set;
import org.snapscript.common.io.PropertyReader;
import org.snapscript.core.error.InternalStateException;
public class DefaultImportReader extends PropertyReader{
private static final String WILD = "*";
public DefaultImportReader(String file) {
super(file);
}
@Override
protected DefaultImport create(String name, char[] data, int off, int length, int line) {
Set imports = createImports(data, off, length, line);
Set modules = createModules(data, off, length, line);
if(imports.remove(WILD)) {
return new DefaultImport(imports, modules, name, true);
}
return new DefaultImport(imports, modules, name);
}
private Set createImports(char[] data, int off, int length, int line) {
Set imports = new LinkedHashSet();
int count = length + off - 1;
for(int i = count; i >= 0; i--) {
char next = data[i];
if(delimiter(next)) {
if(count > i) {
String token = format(data, i+1, count-i);
imports.add(token);
count = i-1;
}
}
if(group(next)) {
return imports;
}
}
throw new InternalStateException("Error with imports from '" + file + "' at line " + line);
}
private Set createModules(char[] data, int off, int length, int line) {
Set packages = new LinkedHashSet();
int count = length + off;
for(int i = off; i < count; i++) {
char next = data[i];
if(delimiter(next)) {
if(i > off) {
String token = format(data, off, i - off);
packages.add(token);
off = i + 1;
}
}
if(group(next)) {
return packages;
}
}
throw new InternalStateException("Error with package from '" + file + "' at line " + line);
}
private boolean group(char value) {
return value == '{';
}
private boolean delimiter(char value) {
return value == ',' || value == '{';
}
@Override
protected boolean terminal(char value) {
return value == '}';
}
}