]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/ModuleUtils.java
Make SCL compiler accept "." as a valid relative path in imports.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / module / ModuleUtils.java
1 package org.simantics.scl.compiler.module;
2
3 public class ModuleUtils {
4     public static String resolveAbsolutePath(String moduleName, String relativeModuleName) throws InvalidModulePathException {
5         if (relativeModuleName.startsWith(".")) {
6             String originalRelativeModuleName = relativeModuleName;
7             int p = moduleName.lastIndexOf('/');
8             String parentPackage = p < 0 ? "" : moduleName.substring(0, p);
9             while(relativeModuleName.startsWith(".")) {
10                 if(relativeModuleName.equals(".")) {
11                     return parentPackage;
12                 }
13                 else if(relativeModuleName.startsWith("./")) {
14                     relativeModuleName = relativeModuleName.substring(2);
15                 }
16                 else if(relativeModuleName.startsWith("../")) {
17                     relativeModuleName = relativeModuleName.substring(3);
18                     if(parentPackage.isEmpty()) {
19                         throw new InvalidModulePathException("Couldn't resolve the relative module name " + originalRelativeModuleName + " when the current module name is " + moduleName + ".");
20                     }
21                     p = parentPackage.lastIndexOf('/');
22                     parentPackage = p < 0 ? "" : parentPackage.substring(0, p);
23                 }
24                 else {
25                     throw new InvalidModulePathException("Couldn't resolve the relative module name " + originalRelativeModuleName + ". It has an invalid syntax.");
26                 }
27             }
28             return parentPackage + "/" + relativeModuleName;
29         } else {
30             return relativeModuleName;
31         }
32     }
33 }