Partial fix for JRUBY-2095
[jruby.git] / src / org / jruby / util / JavaNameMangler.java
blobdfeb2d439c428d609ba8e563c61134e58c63c10a
1 /*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
6 package org.jruby.util;
8 import java.io.IOException;
9 import java.util.regex.Pattern;
11 /**
13 * @author headius
15 public class JavaNameMangler {
16 public static final Pattern PATH_SPLIT = Pattern.compile("[/\\\\]");
18 public static String mangleFilenameForClasspath(String filename) {
19 try {
20 String classPath = "";
21 if(filename.indexOf("!") != -1) {
22 String before = filename.substring(6, filename.indexOf("!"));
23 classPath = new JRubyFile(before + filename.substring(filename.indexOf("!")+1)).getCanonicalPath().toString();
24 } else {
25 classPath = new JRubyFile(filename).getCanonicalPath().toString();
28 String[] pathElements = PATH_SPLIT.split(classPath);
29 StringBuffer newPath = new StringBuffer("ruby");
31 for (String element : pathElements) {
32 if (element.length() <= 0) {
33 continue;
36 newPath.append("/");
37 if (!Character.isJavaIdentifierStart(element.charAt(0))) {
38 newPath.append("$");
40 newPath.append(mangleStringForCleanJavaIdentifier(element));
43 return newPath.toString();
44 } catch (IOException ioe) {
45 ioe.printStackTrace();
46 throw new RuntimeException(ioe);
50 public static String mangledFilenameForStartupClasspath(String filename) {
51 if (filename.equals("-e")) {
52 return "__dash_e__";
55 return mangleFilenameForClasspath(filename);
58 public static String mangleStringForCleanJavaIdentifier(String name) {
59 char[] characters = name.toCharArray();
60 StringBuffer cleanBuffer = new StringBuffer();
61 boolean prevWasReplaced = false;
62 for (int i = 0; i < characters.length; i++) {
63 if (Character.isJavaIdentifierStart(characters[i])) {
64 cleanBuffer.append(characters[i]);
65 prevWasReplaced = false;
66 } else {
67 if (!prevWasReplaced) {
68 cleanBuffer.append("_");
70 prevWasReplaced = true;
71 switch (characters[i]) {
72 case '?':
73 cleanBuffer.append("p_");
74 continue;
75 case '!':
76 cleanBuffer.append("b_");
77 continue;
78 case '<':
79 cleanBuffer.append("lt_");
80 continue;
81 case '>':
82 cleanBuffer.append("gt_");
83 continue;
84 case '=':
85 cleanBuffer.append("equal_");
86 continue;
87 case '[':
88 if ((i + 1) < characters.length && characters[i + 1] == ']') {
89 cleanBuffer.append("aref_");
90 i++;
91 } else {
92 // can this ever happen?
93 cleanBuffer.append("lbracket_");
95 continue;
96 case ']':
97 // given [ logic above, can this ever happen?
98 cleanBuffer.append("rbracket_");
99 continue;
100 case '+':
101 cleanBuffer.append("plus_");
102 continue;
103 case '-':
104 cleanBuffer.append("minus_");
105 continue;
106 case '*':
107 cleanBuffer.append("times_");
108 continue;
109 case '/':
110 cleanBuffer.append("div_");
111 continue;
112 case '&':
113 cleanBuffer.append("and_");
114 continue;
115 case '.':
116 cleanBuffer.append("dot_");
117 continue;
118 default:
119 cleanBuffer.append(Integer.toHexString(characters[i])).append("_");
123 return cleanBuffer.toString();