src/share/classes/sun/rmi/rmic/iiop/IDLNames.java

Tue, 25 May 2010 15:52:11 -0700

author
ohair
date
Tue, 25 May 2010 15:52:11 -0700
changeset 158
91006f157c46
parent 1
55540e827aef
child 371
e324dfb90c9e
permissions
-rw-r--r--

6943119: Rebrand source copyright notices
Reviewed-by: darcy

duke@1 1 /*
ohair@158 2 * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved.
duke@1 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1 4 *
duke@1 5 * This code is free software; you can redistribute it and/or modify it
duke@1 6 * under the terms of the GNU General Public License version 2 only, as
ohair@158 7 * published by the Free Software Foundation. Oracle designates this
duke@1 8 * particular file as subject to the "Classpath" exception as provided
ohair@158 9 * by Oracle in the LICENSE file that accompanied this code.
duke@1 10 *
duke@1 11 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1 14 * version 2 for more details (a copy is included in the LICENSE file that
duke@1 15 * accompanied this code).
duke@1 16 *
duke@1 17 * You should have received a copy of the GNU General Public License version
duke@1 18 * 2 along with this work; if not, write to the Free Software Foundation,
duke@1 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1 20 *
ohair@158 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ohair@158 22 * or visit www.oracle.com if you need additional information or have any
ohair@158 23 * questions.
duke@1 24 */
duke@1 25
duke@1 26 /*
duke@1 27 * Licensed Materials - Property of IBM
duke@1 28 * RMI-IIOP v1.0
duke@1 29 * Copyright IBM Corp. 1998 1999 All Rights Reserved
duke@1 30 *
duke@1 31 */
duke@1 32
duke@1 33 package sun.rmi.rmic.iiop;
duke@1 34
duke@1 35 import java.util.Hashtable;
duke@1 36 import java.util.Locale;
duke@1 37 import sun.tools.java.Identifier;
duke@1 38 import sun.tools.java.CompilerError;
duke@1 39 import sun.tools.java.ClassDefinition;
duke@1 40 import sun.tools.java.ClassNotFound;
duke@1 41 import com.sun.corba.se.impl.util.RepositoryId;
duke@1 42
duke@1 43 /**
duke@1 44 * IDLNames provides static utility methods to perform the IDL
duke@1 45 * name mappings specified in Chapter 5 of the Java Language
duke@1 46 * to IDL specification.
duke@1 47 *
duke@1 48 * @author Bryan Atsatt
duke@1 49 */
duke@1 50 public class IDLNames implements sun.rmi.rmic.iiop.Constants {
duke@1 51
duke@1 52 /**
duke@1 53 * Used to convert ascii to hex.
duke@1 54 */
duke@1 55 public static final byte ASCII_HEX[] = {
duke@1 56 (byte)'0',
duke@1 57 (byte)'1',
duke@1 58 (byte)'2',
duke@1 59 (byte)'3',
duke@1 60 (byte)'4',
duke@1 61 (byte)'5',
duke@1 62 (byte)'6',
duke@1 63 (byte)'7',
duke@1 64 (byte)'8',
duke@1 65 (byte)'9',
duke@1 66 (byte)'A',
duke@1 67 (byte)'B',
duke@1 68 (byte)'C',
duke@1 69 (byte)'D',
duke@1 70 (byte)'E',
duke@1 71 (byte)'F',
duke@1 72 };
duke@1 73
duke@1 74 //_____________________________________________________________________
duke@1 75 // Public Interfaces
duke@1 76 //_____________________________________________________________________
duke@1 77
duke@1 78 /**
duke@1 79 * Convert a name. The nameContext argument MUST be pre-filled with
duke@1 80 * all names from the appropriate context (e.g. all the method names
duke@1 81 * in a given class). The names must not have had any IDL conversions
duke@1 82 * applied.
duke@1 83 * <p>
duke@1 84 * Section 28.3.2.2
duke@1 85 * Section 28.3.2.3
duke@1 86 * Section 28.3.2.4
duke@1 87 * Section 28.3.2.7 (member and method names only)
duke@1 88 */
duke@1 89 public static String getMemberOrMethodName (NameContext nameContext,
duke@1 90 String name,
duke@1 91 BatchEnvironment env) {
duke@1 92
duke@1 93 // Check namesCache...
duke@1 94
duke@1 95 String result = (String) env.namesCache.get(name);
duke@1 96
duke@1 97 if (result == null) {
duke@1 98
duke@1 99 // 28.3.2.7 Case sensitive member names.
duke@1 100
duke@1 101 // Note: This must be done before any of
duke@1 102 // the other conversions!
duke@1 103
duke@1 104 result = nameContext.get(name);
duke@1 105
duke@1 106 // 28.3.2.3 Leading underscores...
duke@1 107
duke@1 108 result = convertLeadingUnderscores(result);
duke@1 109
duke@1 110 // 28.3.2.2 IDL keywords (NOTE: must be done
duke@1 111 // after leading underscore conversion because
duke@1 112 // the mangling for IDL keywords creates a
duke@1 113 // leading underscore!)...
duke@1 114
duke@1 115 result = convertIDLKeywords(result);
duke@1 116
duke@1 117 // 28.3.2.4 Illegal IDL identifier characters...
duke@1 118
duke@1 119 result = convertToISOLatin1(result);
duke@1 120
duke@1 121 // Add to namesCache...
duke@1 122
duke@1 123 env.namesCache.put(name,result);
duke@1 124 }
duke@1 125
duke@1 126 return result;
duke@1 127 }
duke@1 128
duke@1 129 /**
duke@1 130 * Convert names with illegal IDL identifier characters.
duke@1 131 * <p>
duke@1 132 * Section 28.3.2.4
duke@1 133 */
duke@1 134 public static String convertToISOLatin1 (String name) {
duke@1 135
duke@1 136 // First, replace any escape sequences...
duke@1 137
duke@1 138 String result = replace(name,"x\\u","U");
duke@1 139 result = replace(result,"x\\U","U");
duke@1 140
duke@1 141 // Now see if we have any remaining illegal characters (see
duke@1 142 // RepositoryId.IDL_IDENTIFIER_CHARS array)...
duke@1 143
duke@1 144 int length = result.length();
duke@1 145 StringBuffer buffer = null;
duke@1 146
duke@1 147 for (int i = 0; i < length; i++) {
duke@1 148
duke@1 149 char c = result.charAt(i);
duke@1 150
duke@1 151 if (c > 255 || RepositoryId.IDL_IDENTIFIER_CHARS[c] == 0) {
duke@1 152
duke@1 153 // We gotta convert. Have we already started?
duke@1 154
duke@1 155 if (buffer == null) {
duke@1 156
duke@1 157 // No, so get set up...
duke@1 158
duke@1 159 buffer = new StringBuffer(result.substring(0,i));
duke@1 160 }
duke@1 161
duke@1 162 // Convert the character into the IDL escape syntax...
duke@1 163
duke@1 164 buffer.append("U");
duke@1 165 buffer.append((char)ASCII_HEX[(c & 0xF000) >>> 12]);
duke@1 166 buffer.append((char)ASCII_HEX[(c & 0x0F00) >>> 8]);
duke@1 167 buffer.append((char)ASCII_HEX[(c & 0x00F0) >>> 4]);
duke@1 168 buffer.append((char)ASCII_HEX[(c & 0x000F)]);
duke@1 169
duke@1 170 } else {
duke@1 171 if (buffer != null) {
duke@1 172 buffer.append(c);
duke@1 173 }
duke@1 174 }
duke@1 175 }
duke@1 176
duke@1 177 if (buffer != null) {
duke@1 178 result = buffer.toString();
duke@1 179 }
duke@1 180
duke@1 181 return result;
duke@1 182 }
duke@1 183
duke@1 184 /**
duke@1 185 * Convert names which collide with IDL keywords.
duke@1 186 * <p>
duke@1 187 * Section 28.3.2.5
duke@1 188 */
duke@1 189 public static String convertIDLKeywords (String name) {
duke@1 190
duke@1 191 for (int i = 0; i < IDL_KEYWORDS.length; i++) {
duke@1 192 if (name.equalsIgnoreCase(IDL_KEYWORDS[i])) {
duke@1 193 return "_" + name;
duke@1 194 }
duke@1 195 }
duke@1 196
duke@1 197 return name;
duke@1 198 }
duke@1 199
duke@1 200 /**
duke@1 201 * Convert names which have leading underscores
duke@1 202 * <p>
duke@1 203 * Section 28.3.2.3
duke@1 204 */
duke@1 205 public static String convertLeadingUnderscores (String name) {
duke@1 206
duke@1 207 if (name.startsWith("_")) {
duke@1 208 return "J" + name;
duke@1 209 }
duke@1 210
duke@1 211 return name;
duke@1 212 }
duke@1 213
duke@1 214 /**
duke@1 215 * Convert a type name.
duke@1 216 * <p>
duke@1 217 * Section 28.3.2.5
duke@1 218 * Section 28.3.2.7 (class or interface names only)
duke@1 219 * Throws exception if fails 28.3.2.7.
duke@1 220 */
duke@1 221 public static String getClassOrInterfaceName (Identifier id,
duke@1 222 BatchEnvironment env) throws Exception {
duke@1 223
duke@1 224 // Get the type and package name...
duke@1 225
duke@1 226 String typeName = id.getName().toString();
duke@1 227 String packageName = null;
duke@1 228
duke@1 229 if (id.isQualified()) {
duke@1 230 packageName = id.getQualifier().toString();
duke@1 231 }
duke@1 232
duke@1 233 // Check namesCache...
duke@1 234
duke@1 235 String result = (String) env.namesCache.get(typeName);
duke@1 236
duke@1 237 if (result == null) {
duke@1 238
duke@1 239 // 28.3.2.5 Inner classes...
duke@1 240
duke@1 241 result = replace(typeName,". ","__");
duke@1 242
duke@1 243 // 28.3.2.4 Illegal identifier characters...
duke@1 244
duke@1 245 result = convertToISOLatin1(result);
duke@1 246
duke@1 247 // 28.3.2.7 Case sensitive class or interface names...
duke@1 248
duke@1 249 NameContext context = NameContext.forName(packageName,false,env);
duke@1 250 context.assertPut(result);
duke@1 251
duke@1 252 // Run it through the name checks...
duke@1 253
duke@1 254 result = getTypeOrModuleName(result);
duke@1 255
duke@1 256 // Add it to the namesCache...
duke@1 257
duke@1 258 env.namesCache.put(typeName,result);
duke@1 259 }
duke@1 260
duke@1 261 return result;
duke@1 262 }
duke@1 263
duke@1 264 /**
duke@1 265 * Convert an Exception name.
duke@1 266 * <p>
duke@1 267 * Section 28.3.7.2 (see ValueType)
duke@1 268 */
duke@1 269 public static String getExceptionName (String idlName) {
duke@1 270
duke@1 271 String result = idlName;
duke@1 272 // d.11315 Incorrectly mangled exception names
duke@1 273 if (idlName.endsWith(EXCEPTION_SUFFIX)) {
duke@1 274
duke@1 275 // Remove "Exception" and append "Ex". Strip leading underscore
duke@1 276 // in case the idlName is exactly "_Exception"...
duke@1 277
duke@1 278 result = stripLeadingUnderscore(idlName.substring(0,idlName.lastIndexOf(EXCEPTION_SUFFIX)) + EX_SUFFIX);
duke@1 279 } else {
duke@1 280 result = idlName + EX_SUFFIX;
duke@1 281 }
duke@1 282
duke@1 283 return result;
duke@1 284 }
duke@1 285
duke@1 286 /**
duke@1 287 * Convert a qualified Identifier into an array of IDL names.
duke@1 288 * <p>
duke@1 289 * Section 28.3.2.1 (see CompoundType)
duke@1 290 * Throws exception if fails 28.3.2.7.
duke@1 291 */
duke@1 292 public static String[] getModuleNames (Identifier theID,
duke@1 293 boolean boxIt,
duke@1 294 BatchEnvironment env) throws Exception {
duke@1 295
duke@1 296 String[] result = null;
duke@1 297
duke@1 298 if (theID.isQualified()) {
duke@1 299
duke@1 300 // Extract the qualifier...
duke@1 301
duke@1 302 Identifier id = theID.getQualifier();
duke@1 303
duke@1 304 // 28.3.2.7 Case sensitive module names.
duke@1 305
duke@1 306 env.modulesContext.assertPut(id.toString());
duke@1 307
duke@1 308 // Count them...
duke@1 309
duke@1 310 int count = 1;
duke@1 311 Identifier current = id;
duke@1 312 while (current.isQualified()) {
duke@1 313 current = current.getQualifier();
duke@1 314 count++;
duke@1 315 }
duke@1 316
duke@1 317 result = new String[count];
duke@1 318 int index = count-1;
duke@1 319 current = id;
duke@1 320
duke@1 321 // Now walk them and fill our array (backwards)...
duke@1 322
duke@1 323 for (int i = 0; i < count; i++) {
duke@1 324
duke@1 325 String item = current.getName().toString();
duke@1 326
duke@1 327 // Check namesCache...
duke@1 328
duke@1 329 String cachedItem = (String) env.namesCache.get(item);
duke@1 330
duke@1 331 if (cachedItem == null) {
duke@1 332
duke@1 333 // 28.3.2.4 Illegal identifier characters...
duke@1 334
duke@1 335 cachedItem = convertToISOLatin1(item);
duke@1 336
duke@1 337 // Run it through the name checks...
duke@1 338
duke@1 339 cachedItem = getTypeOrModuleName(cachedItem);
duke@1 340
duke@1 341 // Add it to the namesCache...
duke@1 342
duke@1 343 env.namesCache.put(item,cachedItem);
duke@1 344 }
duke@1 345
duke@1 346 result[index--] = cachedItem;
duke@1 347 current = current.getQualifier();
duke@1 348 }
duke@1 349 }
duke@1 350
duke@1 351
duke@1 352 // If it is supposed to be "boxed", prepend
duke@1 353 // IDL_BOXEDIDL_MODULE...
duke@1 354
duke@1 355 if (boxIt) {
duke@1 356 if (result == null) {
duke@1 357 result = IDL_BOXEDIDL_MODULE;
duke@1 358 } else {
duke@1 359 String[] boxed = new String[result.length+IDL_BOXEDIDL_MODULE.length];
duke@1 360 System.arraycopy(IDL_BOXEDIDL_MODULE,0,boxed,0,IDL_BOXEDIDL_MODULE.length);
duke@1 361 System.arraycopy(result,0,boxed,IDL_BOXEDIDL_MODULE.length,result.length);
duke@1 362 result = boxed;
duke@1 363 }
duke@1 364 }
duke@1 365
duke@1 366 return result;
duke@1 367 }
duke@1 368
duke@1 369 /**
duke@1 370 * Get an array name with the specified dimensions.
duke@1 371 * <p>
duke@1 372 * Section 28.3.6 (see ArrayType)
duke@1 373 */
duke@1 374 public static String getArrayName (Type theType, int arrayDimension) {
duke@1 375
duke@1 376 StringBuffer idlName = new StringBuffer(64);
duke@1 377
duke@1 378 // Prefix with seq<n>_...
duke@1 379
duke@1 380 idlName.append(IDL_SEQUENCE);
duke@1 381 idlName.append(Integer.toString(arrayDimension));
duke@1 382 idlName.append("_");
duke@1 383
duke@1 384 // Add the type name. We need to map any spaces in the
duke@1 385 // name to "_"...
duke@1 386
duke@1 387 idlName.append(replace(stripLeadingUnderscore(theType.getIDLName())," ","_"));
duke@1 388
duke@1 389 // And we're done...
duke@1 390
duke@1 391 return idlName.toString();
duke@1 392 }
duke@1 393
duke@1 394 /**
duke@1 395 * Get an array module names.
duke@1 396 */
duke@1 397 public static String[] getArrayModuleNames (Type theType) {
duke@1 398
duke@1 399 String[] moduleName;
duke@1 400 String[] typeModule = theType.getIDLModuleNames();
duke@1 401 int typeModuleLength = typeModule.length;
duke@1 402
duke@1 403 // Does the type have a module?
duke@1 404
duke@1 405 if (typeModuleLength == 0) {
duke@1 406
duke@1 407 // Nope, so just use the sequence module...
duke@1 408
duke@1 409 moduleName = IDL_SEQUENCE_MODULE;
duke@1 410 } else {
duke@1 411
duke@1 412 // Yes, so gotta concatenate...
duke@1 413
duke@1 414 moduleName = new String[typeModuleLength + IDL_SEQUENCE_MODULE.length];
duke@1 415 System.arraycopy(IDL_SEQUENCE_MODULE,0,moduleName,0,IDL_SEQUENCE_MODULE.length);
duke@1 416 System.arraycopy(typeModule,0,moduleName,IDL_SEQUENCE_MODULE.length,typeModuleLength);
duke@1 417 }
duke@1 418
duke@1 419 return moduleName;
duke@1 420 }
duke@1 421
duke@1 422 private static int getInitialAttributeKind (CompoundType.Method method,
duke@1 423 BatchEnvironment env) throws ClassNotFound {
duke@1 424
duke@1 425 int result = ATTRIBUTE_NONE;
duke@1 426
duke@1 427 // First make sure it is not a constructor...
duke@1 428
duke@1 429 if (!method.isConstructor()) {
duke@1 430
duke@1 431 // Now check exceptions. It may not throw any checked
duke@1 432 // exception other than RemoteException or one of its
duke@1 433 // subclasses...
duke@1 434
duke@1 435 boolean validExceptions = true;
duke@1 436 ClassType[] exceptions = method.getExceptions();
duke@1 437
duke@1 438 if (exceptions.length > 0) {
duke@1 439 for (int i = 0; i < exceptions.length; i++) {
duke@1 440 if (exceptions[i].isCheckedException() &&
duke@1 441 !exceptions[i].isRemoteExceptionOrSubclass()) {
duke@1 442 validExceptions = false;
duke@1 443 break;
duke@1 444 }
duke@1 445 }
duke@1 446 } else {
duke@1 447
duke@1 448 // If this is a ValueType, it is ok to not have any exceptions,
duke@1 449 // otherwise this method does not qualify...
duke@1 450
duke@1 451 validExceptions = method.getEnclosing().isType(TYPE_VALUE);
duke@1 452 }
duke@1 453
duke@1 454 if (validExceptions) {
duke@1 455 String name = method.getName();
duke@1 456 int nameLength = name.length();
duke@1 457 int argCount = method.getArguments().length;
duke@1 458 Type returnType = method.getReturnType();
duke@1 459 boolean voidReturn = returnType.isType(TYPE_VOID);
duke@1 460 boolean booleanReturn = returnType.isType(TYPE_BOOLEAN);
duke@1 461
duke@1 462 // It's a getter if name starts with "get" and it has no arguments
duke@1 463 // and a return type that is not void...
duke@1 464
duke@1 465 if (name.startsWith("get") && nameLength > 3 && argCount == 0 && !voidReturn) {
duke@1 466 result = ATTRIBUTE_GET;
duke@1 467 } else {
duke@1 468
duke@1 469 // It's a getter if name starts with "is" and it has no arguments
duke@1 470 // and a boolean return type...
duke@1 471
duke@1 472 if (name.startsWith("is") && nameLength > 2 && argCount == 0 && booleanReturn) {
duke@1 473 result = ATTRIBUTE_IS;
duke@1 474 } else {
duke@1 475
duke@1 476 // It's a setter if name starts with "set" and it has 1 argument
duke@1 477 // and a void return type...
duke@1 478
duke@1 479 if (name.startsWith("set") && nameLength > 3 && argCount == 1 && voidReturn) {
duke@1 480 result = ATTRIBUTE_SET;
duke@1 481 }
duke@1 482 }
duke@1 483 }
duke@1 484 }
duke@1 485 }
duke@1 486
duke@1 487 return result;
duke@1 488 }
duke@1 489
duke@1 490 private static void setAttributeKinds (CompoundType.Method[] methods,
duke@1 491 int[] kinds,
duke@1 492 String[] names) {
duke@1 493
duke@1 494 int count = methods.length;
duke@1 495
duke@1 496 // Strip the prefixes off of the attribute names...
duke@1 497
duke@1 498 for (int i = 0; i < count; i++) {
duke@1 499 switch (kinds[i]) {
duke@1 500 case ATTRIBUTE_GET: names[i] = names[i].substring(3); break;
duke@1 501 case ATTRIBUTE_IS: names[i] = names[i].substring(2); break;
duke@1 502 case ATTRIBUTE_SET: names[i] = names[i].substring(3); break;
duke@1 503 }
duke@1 504 }
duke@1 505
duke@1 506 // Now, we need to look at all the IS attributes to see
duke@1 507 // if there is a corresponding getter or setter which has
duke@1 508 // a different return type. If so, mark it as not an
duke@1 509 // attribute. Do this before checking for invalid setters...
duke@1 510
duke@1 511 for (int i = 0; i < count; i++) {
duke@1 512 if (kinds[i] == ATTRIBUTE_IS) {
duke@1 513 for (int j = 0; j < count; j++) {
duke@1 514 if (j != i &&
duke@1 515 (kinds[j] == ATTRIBUTE_GET || kinds[j] == ATTRIBUTE_SET) &&
duke@1 516 names[i].equals(names[j])) {
duke@1 517
duke@1 518 // We have matching getter or setter. Do the types match?
duke@1 519
duke@1 520 Type isType = methods[i].getReturnType();
duke@1 521 Type targetType;
duke@1 522
duke@1 523 if (kinds[j] == ATTRIBUTE_GET) {
duke@1 524 targetType = methods[j].getReturnType();
duke@1 525 } else {
duke@1 526 targetType = methods[j].getArguments()[0];
duke@1 527 }
duke@1 528
duke@1 529 if (!isType.equals(targetType)) {
duke@1 530
duke@1 531 // No, so forget this guy as an attribute...
duke@1 532
duke@1 533 kinds[i] = ATTRIBUTE_NONE;
duke@1 534 names[i] = methods[i].getName();
duke@1 535 break;
duke@1 536 }
duke@1 537 }
duke@1 538 }
duke@1 539 }
duke@1 540 }
duke@1 541
duke@1 542 // Now, we need to look at all the setters to see if there
duke@1 543 // is a corresponding getter. If not, it is not a setter.
duke@1 544 // If there is, change the getter type to _RW and set the
duke@1 545 // pair index...
duke@1 546
duke@1 547 for (int i = 0; i < count; i++) {
duke@1 548 if (kinds[i] == ATTRIBUTE_SET) {
duke@1 549 int getterIndex = -1;
duke@1 550 int isGetterIndex = -1;
duke@1 551 // First look for is-getters, then for getters.
duke@1 552 // This is preferred for boolean attributes.
duke@1 553 for (int j = 0; j < count; j++) {
duke@1 554 if (j != i && names[i].equals(names[j])) {
duke@1 555 // Yep, is the return type of the getter the same
duke@1 556 // as the argument type of the setter?
duke@1 557
duke@1 558 Type getterReturn = methods[j].getReturnType();
duke@1 559 Type setterArg = methods[i].getArguments()[0];
duke@1 560
duke@1 561 if (getterReturn.equals(setterArg)) {
duke@1 562 if (kinds[j] == ATTRIBUTE_IS) {
duke@1 563 isGetterIndex = j;
duke@1 564 // continue looking for another getter
duke@1 565 } else if (kinds[j] == ATTRIBUTE_GET) {
duke@1 566 getterIndex = j;
duke@1 567 // continue looking for an is-getter
duke@1 568 }
duke@1 569 }
duke@1 570 }
duke@1 571 }
duke@1 572
duke@1 573 if (getterIndex > -1) {
duke@1 574 if (isGetterIndex > -1) {
duke@1 575 // We have both, a boolean is-getter and a boolean getter.
duke@1 576 // Use the is-getter and drop the getter.
duke@1 577
duke@1 578 // We have a matching getter. Change it to a read-write type...
duke@1 579 kinds[isGetterIndex] = ATTRIBUTE_IS_RW;
duke@1 580
duke@1 581 // Now set the pair index for both the getter and the setter...
duke@1 582 methods[isGetterIndex].setAttributePairIndex(i);
duke@1 583 methods[i].setAttributePairIndex(isGetterIndex);
duke@1 584
duke@1 585 // We found a better matching is-getter.
duke@1 586 // Forget this other getter as an attribute.
duke@1 587 kinds[getterIndex] = ATTRIBUTE_NONE;
duke@1 588 names[getterIndex] = methods[getterIndex].getName();
duke@1 589 } else {
duke@1 590 // We only have one getter.
duke@1 591
duke@1 592 // We have a matching getter. Change it to a read-write type...
duke@1 593 kinds[getterIndex] = ATTRIBUTE_GET_RW;
duke@1 594
duke@1 595 // Now set the pair index for both the getter and the setter...
duke@1 596 methods[getterIndex].setAttributePairIndex(i);
duke@1 597 methods[i].setAttributePairIndex(getterIndex);
duke@1 598 }
duke@1 599 } else {
duke@1 600 if (isGetterIndex > -1) {
duke@1 601 // We only have one is-getter.
duke@1 602
duke@1 603 // We have a matching getter. Change it to a read-write type...
duke@1 604 kinds[isGetterIndex] = ATTRIBUTE_IS_RW;
duke@1 605
duke@1 606 // Now set the pair index for both the getter and the setter...
duke@1 607 methods[isGetterIndex].setAttributePairIndex(i);
duke@1 608 methods[i].setAttributePairIndex(isGetterIndex);
duke@1 609 } else {
duke@1 610 // We did not find a matching getter.
duke@1 611 // Forget this setter as an attribute.
duke@1 612 kinds[i] = ATTRIBUTE_NONE;
duke@1 613 names[i] = methods[i].getName();
duke@1 614 }
duke@1 615 }
duke@1 616 }
duke@1 617 }
duke@1 618
duke@1 619 // Finally, do the case conversion and set the
duke@1 620 // attribute kinds for each method...
duke@1 621
duke@1 622 for (int i = 0; i < count; i++) {
duke@1 623
duke@1 624 if (kinds[i] != ATTRIBUTE_NONE) {
duke@1 625
duke@1 626 String name = names[i];
duke@1 627
duke@1 628 // Is the first character upper case?
duke@1 629
duke@1 630 if (Character.isUpperCase(name.charAt(0))) {
duke@1 631
duke@1 632 // Yes, is the second?
duke@1 633
duke@1 634 if (name.length() == 1 || Character.isLowerCase(name.charAt(1))) {
duke@1 635
duke@1 636 // No, so convert the first character to lower case...
duke@1 637
duke@1 638 StringBuffer buffer = new StringBuffer(name);
duke@1 639 buffer.setCharAt(0,Character.toLowerCase(name.charAt(0)));
duke@1 640 names[i] = buffer.toString();
duke@1 641 }
duke@1 642 }
duke@1 643 }
duke@1 644
duke@1 645 methods[i].setAttributeKind(kinds[i]);
duke@1 646 }
duke@1 647 }
duke@1 648
duke@1 649 /**
duke@1 650 * Set all the method names in a given class.
duke@1 651 * <p>
duke@1 652 * Section 28.3.2.7 (see CompoundType)
duke@1 653 * Section 28.3.2.7
duke@1 654 * Section 28.3.4.3 (RemoteType/AbstractType only).
duke@1 655 */
duke@1 656 public static void setMethodNames (CompoundType container,
duke@1 657 CompoundType.Method[] allMethods,
duke@1 658 BatchEnvironment env)
duke@1 659 throws Exception {
duke@1 660
duke@1 661 // This method implements the following name mangling sequence:
duke@1 662 //
duke@1 663 // 1. If methods belong to a Remote interface, identify
duke@1 664 // those which qualify as an attribute under 28.3.4.3.
duke@1 665 // Those that do are referred to as 'attributes' below;
duke@1 666 // those that do not are referred to as 'methods'.
duke@1 667 //
duke@1 668 // 2. Apply the 28.3.4.3 manglings, except "__", to all
duke@1 669 // attribute names.
duke@1 670 //
duke@1 671 // 3. Apply all 28.3 manglings, except 28.3.2.7, to all names.
duke@1 672 //
duke@1 673 // 4. Apply 28.3.2.7 manglings to all method names.
duke@1 674 //
duke@1 675 // 5. Compare each attribute name to each method name. For
duke@1 676 // any which compare equal, append "__" to the attribute
duke@1 677 // name.
duke@1 678 //
duke@1 679 // 6. Compare each name (attribute and method) to all others.
duke@1 680 // If any compare equal, throw an Exception with the
duke@1 681 // conflicting name as the message.
duke@1 682
duke@1 683 int count = allMethods.length;
duke@1 684
duke@1 685 if (count == 0) return;
duke@1 686
duke@1 687 // Make an array of all the method names...
duke@1 688
duke@1 689 String[] names = new String[count];
duke@1 690 for (int i = 0; i < count; i++) {
duke@1 691 names[i] = allMethods[i].getName();
duke@1 692 }
duke@1 693
duke@1 694 // Are we dealing with a RemoteType, AbstractType, or ValueType?
duke@1 695
duke@1 696 CompoundType enclosing = allMethods[0].getEnclosing();
duke@1 697 if (enclosing.isType(TYPE_REMOTE) ||
duke@1 698 enclosing.isType(TYPE_ABSTRACT) ||
duke@1 699 enclosing.isType(TYPE_VALUE)) {
duke@1 700
duke@1 701 // Yes, so we must do the 28.3.4.3 attribute mapping. First, get
duke@1 702 // the initial attribute kind of each method...
duke@1 703
duke@1 704 int[] kinds = new int[count];
duke@1 705
duke@1 706 for (int i = 0; i < count; i++) {
duke@1 707 kinds[i] = getInitialAttributeKind(allMethods[i],env);
duke@1 708 }
duke@1 709
duke@1 710 // Now set the attribute kind for each method and do the
duke@1 711 // 28.3.4.3 name mangling...
duke@1 712
duke@1 713 setAttributeKinds(allMethods,kinds,names);
duke@1 714 }
duke@1 715
duke@1 716 // Make and populate a new context from our names array...
duke@1 717
duke@1 718 NameContext context = new NameContext(true);
duke@1 719
duke@1 720 for (int i = 0; i < count; i++) {
duke@1 721 context.put(names[i]);
duke@1 722 }
duke@1 723
duke@1 724 // Apply the appropriate 28.3 manglings to all the names...
duke@1 725
duke@1 726 boolean haveConstructor = false;
duke@1 727 for (int i = 0; i < count; i++) {
duke@1 728 if (!allMethods[i].isConstructor()) {
duke@1 729 names[i] = getMemberOrMethodName(context,names[i],env);
duke@1 730 } else {
duke@1 731 names[i] = IDL_CONSTRUCTOR;
duke@1 732 haveConstructor = true;
duke@1 733 }
duke@1 734 }
duke@1 735
duke@1 736 // Now do the 28.3.2.7 mangling for method name collisions...
duke@1 737 // Do this in two passes so that we don't change one during
duke@1 738 // the detection of collisions and then miss a real one...
duke@1 739
duke@1 740 boolean overloaded[] = new boolean[count];
duke@1 741 for (int i = 0; i < count; i++) {
duke@1 742 overloaded[i] = (!allMethods[i].isAttribute() &&
duke@1 743 !allMethods[i].isConstructor() &&
duke@1 744 doesMethodCollide(names[i],allMethods[i],allMethods,names,true));
duke@1 745 }
duke@1 746 convertOverloadedMethods(allMethods,names,overloaded);
duke@1 747
duke@1 748 // Now do the same mangling for constructor name collisions...
duke@1 749
duke@1 750 for (int i = 0; i < count; i++) {
duke@1 751 overloaded[i] = (!allMethods[i].isAttribute() &&
duke@1 752 allMethods[i].isConstructor() &&
duke@1 753 doesConstructorCollide(names[i],allMethods[i],allMethods,names,true));
duke@1 754 }
duke@1 755 convertOverloadedMethods(allMethods,names,overloaded);
duke@1 756
duke@1 757 // Now do the 28.3.4.3 mangling for attribute name collisions...
duke@1 758
duke@1 759 for (int i = 0; i < count; i++) {
duke@1 760
duke@1 761 CompoundType.Method method = allMethods[i];
duke@1 762
duke@1 763 // If this is an attribute name, does it collide with a method?
duke@1 764
duke@1 765 if (method.isAttribute() &&
duke@1 766 doesMethodCollide(names[i],method,allMethods,names,true)) {
duke@1 767
duke@1 768 // Yes, so add double underscore...
duke@1 769
duke@1 770 names[i] += "__";
duke@1 771 }
duke@1 772 }
duke@1 773
duke@1 774 // Do the same mangling for any constructors which collide with
duke@1 775 // methods...
duke@1 776
duke@1 777 if (haveConstructor) {
duke@1 778 for (int i = 0; i < count; i++) {
duke@1 779 CompoundType.Method method = allMethods[i];
duke@1 780
duke@1 781 // Is this a constructor which collides with a method?
duke@1 782
duke@1 783 if (method.isConstructor() &&
duke@1 784 doesConstructorCollide(names[i],method,allMethods,names,false)) {
duke@1 785
duke@1 786 // Yes, so add double underscore...
duke@1 787
duke@1 788 names[i] += "__";
duke@1 789 }
duke@1 790 }
duke@1 791 }
duke@1 792
duke@1 793 // Now see if we have a collision with the container name (28.3.2.9).
duke@1 794
duke@1 795 String containerName = container.getIDLName();
duke@1 796 for (int i = 0; i < count; i++) {
duke@1 797 if (names[i].equalsIgnoreCase(containerName)) {
duke@1 798 // Do not add underscore to attributes.
duke@1 799 // Otherwise getFoo will turn into _get_foo_.
duke@1 800 if (! allMethods[i].isAttribute()) {
duke@1 801 names[i] += "_";
duke@1 802 }
duke@1 803 }
duke@1 804 }
duke@1 805
duke@1 806 // Now see if we have any collisions (28.3.2.9). If we do,
duke@1 807 // it's an error. Note: a get/set pair does not collide.
duke@1 808
duke@1 809 for (int i = 0; i < count; i++) {
duke@1 810
duke@1 811 // Does it collide with any other name?
duke@1 812
duke@1 813 if (doesMethodCollide(names[i],allMethods[i],allMethods,names,false)) {
duke@1 814
duke@1 815 // Yes, so bail...
duke@1 816
duke@1 817 throw new Exception(allMethods[i].toString());
duke@1 818 }
duke@1 819 }
duke@1 820
duke@1 821 // Ok. We have unique names. Create the appropriate 'wire' name
duke@1 822 // for each and set as the 'idl' name. If it is an attribute, also
duke@1 823 // set the attribute name...
duke@1 824
duke@1 825 for (int i = 0; i < count; i++) {
duke@1 826
duke@1 827 CompoundType.Method method = allMethods[i];
duke@1 828 String wireName = names[i];
duke@1 829
duke@1 830 if (method.isAttribute()) {
duke@1 831 wireName = ATTRIBUTE_WIRE_PREFIX[method.getAttributeKind()] +
duke@1 832 stripLeadingUnderscore(wireName);
duke@1 833 String attributeName = names[i];
duke@1 834 method.setAttributeName(attributeName);
duke@1 835 }
duke@1 836 method.setIDLName(wireName);
duke@1 837 }
duke@1 838 }
duke@1 839
duke@1 840 private static String stripLeadingUnderscore (String name) {
duke@1 841 if (name != null && name.length() > 1
duke@1 842 && name.charAt(0) == '_')
duke@1 843 {
duke@1 844 return name.substring(1);
duke@1 845 }
duke@1 846 return name;
duke@1 847 }
duke@1 848
duke@1 849
duke@1 850 private static String stripTrailingUnderscore (String name) {
duke@1 851 if (name != null && name.length() > 1 &&
duke@1 852 name.charAt(name.length() - 1) == '_')
duke@1 853 {
duke@1 854 return name.substring(0, name.length() - 1);
duke@1 855 }
duke@1 856 return name;
duke@1 857 }
duke@1 858
duke@1 859
duke@1 860 private static void convertOverloadedMethods(CompoundType.Method[] allMethods,
duke@1 861 String[] names,
duke@1 862 boolean[] overloaded) {
duke@1 863
duke@1 864 for (int i = 0; i < names.length; i++) {
duke@1 865
duke@1 866 // Do we need to mangle it?
duke@1 867
duke@1 868 if (overloaded[i]) {
duke@1 869
duke@1 870 // Yes, so add arguments...
duke@1 871
duke@1 872 CompoundType.Method method = allMethods[i];
duke@1 873 Type[] args = method.getArguments();
duke@1 874
duke@1 875 for (int k = 0; k < args.length; k++) {
duke@1 876
duke@1 877 // Add the separator...
duke@1 878
duke@1 879 names[i] += "__";
duke@1 880
duke@1 881 // Get the fully qualified IDL name, without the "::"
duke@1 882 // prefix...
duke@1 883
duke@1 884 String argIDLName = args[k].getQualifiedIDLName(false);
duke@1 885
duke@1 886 // Replace any occurances of "::_" with "_" to
duke@1 887 // undo any IDL keyword mangling and do next step
duke@1 888 // at the same time...
duke@1 889
duke@1 890 argIDLName = replace(argIDLName,"::_","_");
duke@1 891
duke@1 892 // Replace any occurances of "::" with "_"...
duke@1 893
duke@1 894 argIDLName = replace(argIDLName,"::","_");
duke@1 895
duke@1 896 // Replace any occurances of " " with "_"...
duke@1 897
duke@1 898 argIDLName = replace(argIDLName," ","_");
duke@1 899
duke@1 900 // Add the argument type name...
duke@1 901
duke@1 902 names[i] += argIDLName;
duke@1 903 }
duke@1 904
duke@1 905 if (args.length == 0) {
duke@1 906 names[i] += "__";
duke@1 907 }
duke@1 908
duke@1 909 // Remove any IDL keyword mangling...
duke@1 910
duke@1 911 names[i] = stripLeadingUnderscore(names[i]);
duke@1 912 }
duke@1 913 }
duke@1 914 }
duke@1 915
duke@1 916 private static boolean doesMethodCollide (String name,
duke@1 917 CompoundType.Method method,
duke@1 918 CompoundType.Method[] allMethods,
duke@1 919 String[] allNames,
duke@1 920 boolean ignoreAttributes) {
duke@1 921
duke@1 922 // Scan all methods looking for a match...
duke@1 923
duke@1 924 for (int i = 0; i < allMethods.length; i++) {
duke@1 925
duke@1 926 CompoundType.Method target = allMethods[i];
duke@1 927
duke@1 928 if (method != target && // Not same instance
duke@1 929 !target.isConstructor() && // Not a constructor
duke@1 930 (!ignoreAttributes || !target.isAttribute()) && // Correct kind
duke@1 931 name.equals(allNames[i])) { // Same names
duke@1 932
duke@1 933 // Are we looking at a get/set pair?
duke@1 934
duke@1 935 int kind1 = method.getAttributeKind();
duke@1 936 int kind2 = target.getAttributeKind();
duke@1 937
duke@1 938 if ((kind1 != ATTRIBUTE_NONE && kind2 != ATTRIBUTE_NONE) &&
duke@1 939 ((kind1 == ATTRIBUTE_SET && kind2 != ATTRIBUTE_SET) ||
duke@1 940 (kind1 != ATTRIBUTE_SET && kind2 == ATTRIBUTE_SET) ||
duke@1 941 // one is a is-getter/setter pair and the other is just a getter
duke@1 942 (kind1 == ATTRIBUTE_IS_RW && kind2 == ATTRIBUTE_GET) ||
duke@1 943 (kind1 == ATTRIBUTE_GET && kind2 == ATTRIBUTE_IS_RW))) {
duke@1 944
duke@1 945 // Yes, so ignore it...
duke@1 946
duke@1 947 } else {
duke@1 948
duke@1 949 // No, so we have a collision...
duke@1 950
duke@1 951 return true;
duke@1 952 }
duke@1 953 }
duke@1 954 }
duke@1 955
duke@1 956 return false;
duke@1 957 }
duke@1 958
duke@1 959 private static boolean doesConstructorCollide (String name,
duke@1 960 CompoundType.Method method,
duke@1 961 CompoundType.Method[] allMethods,
duke@1 962 String[] allNames,
duke@1 963 boolean compareConstructors) {
duke@1 964
duke@1 965 // Scan all methods looking for a match...
duke@1 966
duke@1 967 for (int i = 0; i < allMethods.length; i++) {
duke@1 968
duke@1 969 CompoundType.Method target = allMethods[i];
duke@1 970
duke@1 971 if (method != target && // Not same instance
duke@1 972 (target.isConstructor() == compareConstructors) && // Correct kind
duke@1 973 name.equals(allNames[i])) { // Same names
duke@1 974
duke@1 975 // We have a collision...
duke@1 976
duke@1 977 return true;
duke@1 978 }
duke@1 979 }
duke@1 980
duke@1 981 return false;
duke@1 982 }
duke@1 983
duke@1 984
duke@1 985 /**
duke@1 986 * Set all the member names in a given class.
duke@1 987 * <p>
duke@1 988 * Section 28.3.2.7 (see CompoundType)
duke@1 989 * Section 28.3.2.7
duke@1 990 */
duke@1 991 public static void setMemberNames (CompoundType container,
duke@1 992 CompoundType.Member[] allMembers,
duke@1 993 CompoundType.Method[] allMethods,
duke@1 994 BatchEnvironment env)
duke@1 995 throws Exception {
duke@1 996
duke@1 997 // Make and populate a new context...
duke@1 998
duke@1 999 NameContext context = new NameContext(true);
duke@1 1000
duke@1 1001 for (int i = 0; i < allMembers.length; i++) {
duke@1 1002 context.put(allMembers[i].getName());
duke@1 1003 }
duke@1 1004
duke@1 1005 // Now set all the idl names...
duke@1 1006
duke@1 1007 for (int i = 0; i < allMembers.length; i++) {
duke@1 1008
duke@1 1009 CompoundType.Member member = allMembers[i];
duke@1 1010 String idlName = getMemberOrMethodName(context,member.getName(),env);
duke@1 1011 member.setIDLName(idlName);
duke@1 1012 }
duke@1 1013
duke@1 1014 // First see if we have a collision with the container name (28.3.2.9).
duke@1 1015
duke@1 1016 String containerName = container.getIDLName();
duke@1 1017 for (int i = 0; i < allMembers.length; i++) {
duke@1 1018 String name = allMembers[i].getIDLName();
duke@1 1019 if (name.equalsIgnoreCase(containerName)) {
duke@1 1020 // REVISIT - How is this different than line 788
duke@1 1021 allMembers[i].setIDLName(name+"_");
duke@1 1022 }
duke@1 1023 }
duke@1 1024
duke@1 1025 // Check for collisions between member names...
duke@1 1026
duke@1 1027 for (int i = 0; i < allMembers.length; i++) {
duke@1 1028 String name = allMembers[i].getIDLName();
duke@1 1029 for (int j = 0; j < allMembers.length; j++) {
duke@1 1030 if (i != j && allMembers[j].getIDLName().equals(name)) {
duke@1 1031
duke@1 1032 // Collision...
duke@1 1033
duke@1 1034 throw new Exception(name);
duke@1 1035 }
duke@1 1036 }
duke@1 1037 }
duke@1 1038
duke@1 1039 // Now check for collisions between member names and
duke@1 1040 // method names...
duke@1 1041
duke@1 1042 boolean changed;
duke@1 1043 do {
duke@1 1044 changed = false;
duke@1 1045 for (int i = 0; i < allMembers.length; i++) {
duke@1 1046 String name = allMembers[i].getIDLName();
duke@1 1047 for (int j = 0; j < allMethods.length; j++) {
duke@1 1048 if (allMethods[j].getIDLName().equals(name)) {
duke@1 1049
duke@1 1050 // Collision, so append "_" to member name...
duke@1 1051
duke@1 1052 allMembers[i].setIDLName(name+"_");
duke@1 1053 changed = true;
duke@1 1054 break;
duke@1 1055 }
duke@1 1056 }
duke@1 1057 }
duke@1 1058 } while (changed);
duke@1 1059 }
duke@1 1060
duke@1 1061 /**
duke@1 1062 * Get the name for the specified type code.
duke@1 1063 * <p>
duke@1 1064 * Section 28.3..3 (see PrimitiveType)
duke@1 1065 * Section 28.3.5.10 (see SpecialClassType)
duke@1 1066 * Section 28.3.4.1 (see SpecialInterfaceType)
duke@1 1067 * Section 28.3.10.1 (see SpecialInterfaceType)
duke@1 1068 * Section 28.3.10.2 (see SpecialClassType)
duke@1 1069 */
duke@1 1070 public static String getTypeName(int typeCode, boolean isConstant) {
duke@1 1071
duke@1 1072 String idlName = null;
duke@1 1073
duke@1 1074 switch (typeCode) {
duke@1 1075 case TYPE_VOID: idlName = IDL_VOID; break;
duke@1 1076 case TYPE_BOOLEAN: idlName = IDL_BOOLEAN; break;
duke@1 1077 case TYPE_BYTE: idlName = IDL_BYTE; break;
duke@1 1078 case TYPE_CHAR: idlName = IDL_CHAR; break;
duke@1 1079 case TYPE_SHORT: idlName = IDL_SHORT; break;
duke@1 1080 case TYPE_INT: idlName = IDL_INT; break;
duke@1 1081 case TYPE_LONG: idlName = IDL_LONG; break;
duke@1 1082 case TYPE_FLOAT: idlName = IDL_FLOAT; break;
duke@1 1083 case TYPE_DOUBLE: idlName = IDL_DOUBLE; break;
duke@1 1084 case TYPE_ANY: idlName = IDL_ANY; break;
duke@1 1085 case TYPE_CORBA_OBJECT: idlName = IDL_CORBA_OBJECT; break;
duke@1 1086 case TYPE_STRING:
duke@1 1087 {
duke@1 1088 if (isConstant) {
duke@1 1089 idlName = IDL_CONSTANT_STRING;
duke@1 1090 } else {
duke@1 1091 idlName = IDL_STRING;
duke@1 1092 }
duke@1 1093
duke@1 1094 break;
duke@1 1095 }
duke@1 1096 }
duke@1 1097
duke@1 1098 return idlName;
duke@1 1099 }
duke@1 1100
duke@1 1101 /**
duke@1 1102 * Create a qualified name.
duke@1 1103 */
duke@1 1104 public static String getQualifiedName (String[] idlModuleNames, String idlName) {
duke@1 1105 String result = null;
duke@1 1106 if (idlModuleNames != null && idlModuleNames.length > 0) {
duke@1 1107 for (int i = 0; i < idlModuleNames.length;i++) {
duke@1 1108 if (i == 0) {
duke@1 1109 result = idlModuleNames[0];
duke@1 1110 } else {
duke@1 1111 result += IDL_NAME_SEPARATOR;
duke@1 1112 result += idlModuleNames[i];
duke@1 1113 }
duke@1 1114 }
duke@1 1115 result += IDL_NAME_SEPARATOR;
duke@1 1116 result += idlName;
duke@1 1117 } else {
duke@1 1118 result = idlName;
duke@1 1119 }
duke@1 1120 return result;
duke@1 1121 }
duke@1 1122
duke@1 1123 /**
duke@1 1124 * Replace substrings
duke@1 1125 * @param source The source string.
duke@1 1126 * @param match The string to search for within the source string.
duke@1 1127 * @param replace The replacement for any matching components.
duke@1 1128 * @return
duke@1 1129 */
duke@1 1130 public static String replace (String source, String match, String replace) {
duke@1 1131
duke@1 1132 int index = source.indexOf(match,0);
duke@1 1133
duke@1 1134 if (index >=0) {
duke@1 1135
duke@1 1136 // We have at least one match, so gotta do the
duke@1 1137 // work...
duke@1 1138
duke@1 1139 StringBuffer result = new StringBuffer(source.length() + 16);
duke@1 1140 int matchLength = match.length();
duke@1 1141 int startIndex = 0;
duke@1 1142
duke@1 1143 while (index >= 0) {
duke@1 1144 result.append(source.substring(startIndex,index));
duke@1 1145 result.append(replace);
duke@1 1146 startIndex = index + matchLength;
duke@1 1147 index = source.indexOf(match,startIndex);
duke@1 1148 }
duke@1 1149
duke@1 1150 // Grab the last piece, if any...
duke@1 1151
duke@1 1152 if (startIndex < source.length()) {
duke@1 1153 result.append(source.substring(startIndex));
duke@1 1154 }
duke@1 1155
duke@1 1156 return result.toString();
duke@1 1157
duke@1 1158 } else {
duke@1 1159
duke@1 1160 // No matches, just return the source...
duke@1 1161
duke@1 1162 return source;
duke@1 1163 }
duke@1 1164 }
duke@1 1165
duke@1 1166 /**
duke@1 1167 * Get an IDL style repository id for
duke@1 1168 */
duke@1 1169 public static String getIDLRepositoryID (String idlName) {
duke@1 1170 return IDL_REPOSITORY_ID_PREFIX +
duke@1 1171 replace(idlName,"::", "/") +
duke@1 1172 IDL_REPOSITORY_ID_VERSION;
duke@1 1173 }
duke@1 1174
duke@1 1175 //_____________________________________________________________________
duke@1 1176 // Internal Interfaces
duke@1 1177 //_____________________________________________________________________
duke@1 1178
duke@1 1179
duke@1 1180 /**
duke@1 1181 * Convert a type or module name.
duke@1 1182 * <p>
duke@1 1183 * Section 28.3.2.2
duke@1 1184 * Section 28.3.2.3
duke@1 1185 */
duke@1 1186 private static String getTypeOrModuleName (String name) {
duke@1 1187
duke@1 1188 // 28.3.2.3 Leading underscores...
duke@1 1189
duke@1 1190 String result = convertLeadingUnderscores(name);
duke@1 1191
duke@1 1192 // 28.3.2.2 IDL keywords (NOTE: must be done
duke@1 1193 // after leading underscore conversion because
duke@1 1194 // the mangling for IDL keywords creates a
duke@1 1195 // leading underscore!)...
duke@1 1196
duke@1 1197 return convertIDLKeywords(result);
duke@1 1198 }
duke@1 1199 }

mercurial