public boolean testGlobalInstance()

in meta/src/main/java/org/arend/lib/util/DefImplInstanceSearchParameters.java [37:78]


  public boolean testGlobalInstance(@NotNull CoreFunctionDefinition instance) {
    if (!(instance.getResultType() instanceof CoreClassCallExpression)) {
      return false;
    }

    for (CoreClassField relationField : relationFields) {
      CoreAbsExpression absImpl = ((CoreClassCallExpression) instance.getResultType()).getAbsImplementation(relationField);
      if (absImpl == null) {
        continue;
      }
      CoreExpression impl = absImpl.getExpression();
      if (!(impl instanceof CoreLamExpression)) {
        continue;
      }

      CoreParameter param1 = ((CoreLamExpression) impl).getParameters();
      CoreParameter param2 = param1.getNext();
      CoreExpression body = ((CoreLamExpression) impl).getBody();
      if (!param2.hasNext()) {
        if (!(body instanceof CoreLamExpression)) {
          continue;
        }
        param2 = ((CoreLamExpression) body).getParameters();
        body = ((CoreLamExpression) body).getBody();
      }
      if (param2.getNext().hasNext()) {
        continue;
      }

      if (!(body instanceof CoreDefCallExpression)) {
        continue;
      }
      CoreDefCallExpression defCall = (CoreDefCallExpression) body;
      var args = defCall.getDefCallArguments();
      if (defCall.getDefinition() == definition && args.size() >= 2 && args.get(args.size() - 2) instanceof CoreReferenceExpression && ((CoreReferenceExpression) args.get(args.size() - 2)).getBinding() == param1.getBinding() && args.get(args.size() - 1) instanceof CoreReferenceExpression && ((CoreReferenceExpression) args.get(args.size() - 1)).getBinding() == param2.getBinding()) {
        this.relationField = relationField;
        return true;
      }
    }

    return false;
  }