Пример #1
0
  public Method lookupJavaMethod(
      IEvaluator<Result<IValue>> eval,
      FunctionDeclaration func,
      Environment env,
      boolean hasReflectiveAccess) {
    if (!func.isAbstract()) {
      throw new NonAbstractJavaFunction(func);
    }

    String className = getClassName(func);
    String name = Names.name(func.getSignature().getName());

    if (className.length() == 0) { // TODO: Can this ever be thrown since the Class instance has
      // already been identified via the javaClass tag.
      throw new MissingTag(JAVA_CLASS_TAG, func);
    }

    for (ClassLoader loader : loaders) {
      try {
        Class<?> clazz = loader.loadClass(className);
        Parameters parameters = func.getSignature().getParameters();
        Class<?>[] javaTypes = getJavaTypes(parameters, env, hasReflectiveAccess);

        try {
          Method m;

          if (javaTypes.length > 0) { // non-void
            m = clazz.getMethod(name, javaTypes);
          } else {
            m = clazz.getMethod(name);
          }

          return m;
        } catch (SecurityException e) {
          throw RuntimeExceptionFactory.permissionDenied(
              vf.string(e.getMessage()), eval.getCurrentAST(), eval.getStackTrace());
        } catch (NoSuchMethodException e) {
          throw new UndeclaredJavaMethod(e.getMessage(), func);
        }
      } catch (ClassNotFoundException e) {
        continue;
      }
    }

    throw new UndeclaredJavaMethod(className + "." + name, func);
  }
Пример #2
0
  private String getClassName(FunctionDeclaration declaration) {
    Tags tags = declaration.getTags();

    if (tags.hasTags()) {
      for (Tag tag : tags.getTags()) {
        if (Names.name(tag.getName()).equals(JAVA_CLASS_TAG)) {
          if (tag.hasContents()) {
            String contents = ((TagString.Lexical) tag.getContents()).getString();

            if (contents.length() > 2 && contents.startsWith("{")) {
              contents = contents.substring(1, contents.length() - 1);
            }
            return contents;
          }
        }
      }
    }

    return "";
  }
Пример #3
0
  public static Type typeOf(
      List<TypeArg> args, Environment env, boolean instantiateTypeParameters) {
    Type[] fieldTypes = new Type[args.size()];
    String[] fieldLabels = new String[args.size()];

    int i = 0;
    boolean allLabeled = true;
    boolean someLabeled = false;

    for (TypeArg arg : args) {
      fieldTypes[i] = arg.getType().typeOf(env, instantiateTypeParameters, null);

      if (arg.isNamed()) {
        fieldLabels[i] = Names.name(arg.getName());
        someLabeled = true;
      } else {
        fieldLabels[i] = null;
        allLabeled = false;
      }
      i++;
    }

    if (someLabeled && !allLabeled) {
      // TODO: this ast is not the root of the cause
      throw new PartiallyLabeledFields(args.get(0));
    }

    if (!allLabeled) {
      return TF.tupleType(fieldTypes);
    }
    for (int j = 0; j < fieldLabels.length - 1; j++) {
      for (int k = j + 1; k < fieldLabels.length; k++) {
        if (fieldLabels[j].equals(fieldLabels[k])) {
          throw new RedeclaredField(fieldLabels[j], args.get(k));
        }
      }
    }

    return TF.tupleType(fieldTypes, fieldLabels);
  }