flex2.compiler.util.NameFormatter Maven / Gradle / Ivy
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package flex2.compiler.util;
import flex2.compiler.SymbolTable;
import flex2.compiler.mxml.lang.StandardDefs;
//import flex2.compiler.swc.SwcScript;
/**
* AS3 definition name conversion utilities.
*/
/*
* TODO need to migrate away from having both colon- and dot-delimited classnames encoded in Strings. It's
* impossible to tell except from (sometimes nonlocal) context whether 'String className' means dot-format or
* colon-format, and since source code requires one and the reflection system needs the other, this is an ongoing
* source of bugs, confusion etc. Eventually, all colon-delimited classnames should be stored as QNames -
* qname.toString() is (now) a reasonably cheap way to recover the colon-delimited format. The goal is to get the
* code to the point that 'String className' can be assumed to be a classname in dot format. The sign that we've
* succeeded will be the successful removal of NameFormatter.toColon(String, String).
*
* TODO remove inline ':' -> '.' type code from the codebase, call these methods instead.
* TODO once the abstraction is clear, "toColon"/"toDot" should be renamed to reflect the semantics of the names rather
* than the actual characters involved: "toInternal", "toExternal" or whatever. But for now I can never remember which
* is which.
*/
public class NameFormatter
{
/**
* convert pair of strings to single string delimited by '.'
*/
public static String toDot(String ns, String n)
{
return ns.length() > 0 ? ns + '.' + n : n;
}
/**
* convert pair of strings to single string delimited by ':'
*/
public static String toColon(String ns, String n)
{
return ns.length() > 0 ? (ns + ':' + n).intern() : n;
}
/**
* convert p.q:C to p.q.C
* NOTE: idempotent
*/
public static String toDot(String n)
{
assert n.indexOf('/') == -1;
return toDot(n, ':');
}
/**
*
*/
public static String toDot(QName qname)
{
return toDot(qname.getNamespace(), qname.getLocalPart());
}
/**
* convert all instances of delimiter
with '.'.
*/
public static String toDot(String n, char delimiter)
{
return n.replace(delimiter, '.');
}
/**
* convert p.q.C to p.q:C
* NOTE: idempotent
*/
public static String toColon(String n)
{
String result;
if (n.startsWith(StandardDefs.CLASS_VECTOR))
{
result = SymbolTable.VECTOR + n.substring(StandardDefs.CLASS_VECTOR.length());
}
else if (n.startsWith(SymbolTable.VECTOR))
{
result = n;
}
else
{
int i = toDot(n).lastIndexOf('.');
result = i > 0 ? (n.substring(0, i) + ':' + n.substring(i + 1)).intern() : n;
}
return result;
}
/**
*
*/
public static String toDotStar(String pkg)
{
return pkg + ".*";
}
/**
* retrieve package name from qualified name (dot or slash format ok)
*/
public static String retrievePackageName(String n)
{
int i = toDot(n).lastIndexOf('.');
return i == -1 ? "" : n.substring(0, i);
}
/**
* just removes $internal from package name.
*/
public static String normalizePackageName(String n)
{
return n.endsWith("$internal") ? n.substring(0, n.length() - "$internal".length()) : n;
}
/**
* retrieve class name from qualified name (dot or slash format ok)
*/
public static String retrieveClassName(String n)
{
String result;
String toDot = toDot(n);
if (toDot.startsWith(StandardDefs.CLASS_VECTOR + ".<"))
{
result = "Vector" + n.substring(StandardDefs.CLASS_VECTOR.length() + 1);
}
else
{
int i = toDot.lastIndexOf('.');
result = i == -1 ? n : n.substring(i + 1);
}
return result;
}
/**
* convert name (dot or slash format ok) to QName
*/
public static QName toQName(String n)
{
int i = toDot(n).lastIndexOf('.');
return i >= 0 ?
new QName(n.substring(0, i), n.substring(i + 1)) :
new QName("", n);
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy