]> gerrit.simantics Code Review - simantics/platform.git/blob
bd07654743acb86028727928b5d70c704d15b756
[simantics/platform.git] /
1 package org.simantics.scl.compiler.internal.codegen.utils;
2
3 import org.simantics.scl.compiler.types.TCon;
4 import org.simantics.scl.compiler.types.TPred;
5
6
7 public class JavaNamingPolicy {
8
9     private final String moduleName;
10     private final String moduleClassName;
11     int closureCount = 0;
12
13     public JavaNamingPolicy(String moduleName) {
14         this.moduleName = moduleName;
15         this.moduleClassName = "scl/" + moduleNameToClassName(moduleName);
16     }
17     
18     private static boolean isAllowableClassNameChar(char c) {
19         return (c >= 'a' && c <= 'z')
20                 || (c >= 'A' && c <= 'Z')
21                 || (c >= '0' && c <= '9')
22                 || c == '$'
23                 ;
24     }
25     
26     public static String moduleNameToClassName(String moduleName) {
27         StringBuilder b = new StringBuilder(moduleName.length());
28         int length = moduleName.length();
29         for(int i=0;i<length;++i) {
30             char c = moduleName.charAt(i);
31             if(c == '/' || isAllowableClassNameChar(c))
32                 b.append(c);
33             else
34                 b.append('_').append((int)c).append('_');
35         }
36         //System.out.println("m2c " + moduleName + " -> " + b.toString());
37         return b.toString().replace("..", "._.");
38     }
39     
40     public static String classNameToModuleName(String className) {
41         className = className.replace("._.", "..");
42         StringBuilder b = new StringBuilder(className.length());
43         int length = className.length();
44         for(int i=0;i<length;++i) {
45             char c = className.charAt(i);
46             if(c == '.')
47                 b.append('/');
48             else if(c == '_') {
49                 StringBuilder nb = new StringBuilder(4);
50                 while(true) {
51                     c = className.charAt(++i);
52                     if(Character.isDigit(c))
53                         nb.append(c);
54                     else
55                         break;
56                 }
57                 b.append((char)Integer.parseInt(nb.toString()));
58             }
59             else 
60                 b.append(c);
61         }
62         //System.out.println("c2m " + className + " -> " + b.toString());
63         return b.toString();
64     }
65     
66     public String getModuleClassName() {
67         return moduleClassName;
68     }
69     
70     public String getMethodName(String name) {
71         return NameMangling.mangle(name);
72     }
73
74     public String getFreshClosureClassNameSuffix() {
75         return "$" + (++closureCount);
76     }
77     
78     public String getFreshClosureClassName() {
79         return moduleClassName + "$" + (++closureCount);
80     }
81
82     public String getDataTypeClassName(String name) {
83         return moduleClassName + "$" + name; 
84     }
85     
86     public String getConstructorClassName(String name) {
87         return moduleClassName + "$" + name + "Constructor";
88     }
89     
90     public String getTypeClassInterfaceName(TCon name) {
91         return moduleClassName + "$" + name.name + "Class"; 
92     }
93
94     public String getTypeClassInstanceClassName(String name) {
95         return moduleClassName + "$" + name + "Instance";
96     }
97
98     public String getInstanceClassName(TPred instance) {
99         return moduleClassName + "$" + instance.toName();
100     }
101
102     public String getModuleName() {
103         return moduleName;
104     }    
105 }