001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.cnd.modelimpl.csm.core;
043:
044: import java.util.ArrayList;
045: import java.util.Collection;
046: import java.util.List;
047: import java.util.StringTokenizer;
048: import java.util.logging.Level;
049: import java.util.logging.Logger;
050: import org.netbeans.modules.cnd.api.model.CsmDeclaration;
051: import org.netbeans.modules.cnd.api.model.CsmFile;
052: import org.netbeans.modules.cnd.api.model.CsmIdentifiable;
053: import org.netbeans.modules.cnd.api.model.CsmNamespace;
054: import org.netbeans.modules.cnd.api.model.CsmObject;
055: import org.netbeans.modules.cnd.api.model.CsmOffsetable;
056: import org.netbeans.modules.cnd.modelimpl.csm.NamespaceImpl;
057: import org.netbeans.modules.cnd.modelimpl.debug.TraceFlags;
058:
059: /**
060: * Misc. (static) utility functions
061: * @author Vladimir Kvashin
062: */
063: public class Utils {
064:
065: public static final Logger LOG = Logger
066: .getLogger("org.netbeans.modules.cnd.modelimpl"); // NOI18N
067: private static final int LOG_LEVEL = Integer.getInteger(
068: "org.netbeans.modules.cnd.modelimpl.level", -1).intValue(); // NOI18N
069:
070: static {
071: // command line param has priority for logging
072: // do not change it
073: if (LOG_LEVEL == -1) {
074: // command line param has priority for logging
075: if (TraceFlags.DEBUG) {
076: LOG.setLevel(Level.ALL);
077: } else {
078: LOG.setLevel(Level.SEVERE);
079: }
080: }
081: }
082:
083: public static CsmOffsetable createOffsetable(CsmFile file,
084: int startOffset, int endOffset) {
085: return new OffsetableBase(file, startOffset, endOffset);
086: }
087:
088: public static String getQualifiedName(String name,
089: CsmNamespace parent) {
090: StringBuilder sb = new StringBuilder(name);
091: if (parent != null) {
092: if (!parent.isGlobal()) {
093: sb.insert(0, "::"); // NOI18N
094: sb.insert(0, parent.getQualifiedName());
095: }
096: }
097: return sb.toString();
098: }
099:
100: public static String getNestedNamespaceQualifiedName(
101: CharSequence name, NamespaceImpl parent,
102: boolean createForEmptyNames) {
103: StringBuilder sb = new StringBuilder(name);
104: if (parent != null) {
105: if (name.length() == 0 && createForEmptyNames) {
106: sb.append(parent.getNameForUnnamedElement());
107: }
108: if (!parent.isGlobal()) {
109: sb.insert(0, "::"); // NOI18N
110: sb.insert(0, parent.getQualifiedName());
111: }
112: }
113: return sb.toString();
114: }
115:
116: public static String toString(String[] a) {
117: StringBuilder sb = new StringBuilder("["); // NOI18N
118: for (int i = 0; i < a.length; i++) {
119: if (i > 0) {
120: sb.append(',');
121: }
122: sb.append(a[i]);
123: }
124: sb.append(']');
125: return sb.toString();
126: }
127:
128: public static String[] splitQualifiedName(String qualified) {
129: List v = new ArrayList();
130: for (StringTokenizer t = new StringTokenizer(qualified,
131: ": \t\n\r\f", false); t.hasMoreTokens();) {// NOI18N
132: v.add(t.nextToken());
133: }
134: return (String[]) v.toArray(new String[v.size()]);
135: }
136:
137: public static void disposeAll(Collection<? extends CsmObject> coll) {
138: for (CsmObject elem : coll) {
139: if (elem instanceof Disposable) {
140: Disposable decl = (Disposable) elem;
141: if (TraceFlags.TRACE_DISPOSE) {
142: System.err.println("disposing with UID "
143: + ((CsmIdentifiable) elem).getUID());
144: }
145: decl.dispose();
146: } else {
147: if (TraceFlags.TRACE_DISPOSE) {
148: System.err.println("non disposable with UID "
149: + ((CsmIdentifiable) elem).getUID());
150: }
151: }
152: }
153: }
154:
155: public static String getCsmIncludeKindkey() {
156: // Returned string should be differed from getCsmDeclarationKindkey()
157: return "I"; // NOI18N
158: }
159:
160: public static String getCsmDeclarationKindkey(
161: CsmDeclaration.Kind kind) {
162: // Returned string should be differed from getCsmIncludeKindkey()
163: switch (kind) {
164: case BUILT_IN:
165: return "B"; // NOI18N
166: case CLASS:
167: return "C"; // NOI18N
168: case UNION:
169: return "U"; // NOI18N
170: case STRUCT:
171: return "S"; // NOI18N
172: case ENUM:
173: return "E"; // NOI18N
174: case ENUMERATOR:
175: return "e"; // NOI18N
176: case MACRO:
177: return "M"; // NOI18N
178: case VARIABLE:
179: return "V"; // NOI18N
180: case VARIABLE_DEFINITION:
181: return "v"; // NOI18N
182: case FUNCTION:
183: return "F"; // NOI18N
184: case FUNCTION_DEFINITION:
185: return "f"; // NOI18N
186: case TEMPLATE_SPECIALIZATION:
187: return "s"; // NOI18N
188: case TYPEDEF:
189: return "t"; // NOI18N
190: case ASM:
191: return "A"; // NOI18N
192: case TEMPLATE_DECLARATION:
193: return "T"; // NOI18N
194: case NAMESPACE_DEFINITION:
195: return "N"; // NOI18N
196: case NAMESPACE_ALIAS:
197: return "a"; // NOI18N
198: case USING_DIRECTIVE:
199: return "U"; // NOI18N
200: case USING_DECLARATION:
201: return "u"; // NOI18N
202: case CLASS_FORWARD_DECLARATION:
203: return "w"; // NOI18N
204: case CLASS_FRIEND_DECLARATION:
205: return "r"; // NOI18N
206: default:
207: throw new IllegalArgumentException(
208: "Unexpected value of CsmDeclaration.Kind"); //NOI18N
209: }
210: }
211: }
|