001 /*
002 * Copyright 2010-2013 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.jetbrains.jet.lang.resolve;
018
019 import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
020 import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
021 import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
022 import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
023
024 public class OverloadUtil {
025
026 /**
027 * Does not check names.
028 */
029 public static OverloadCompatibilityInfo isOverloadable(CallableDescriptor a, CallableDescriptor b) {
030 int abc = braceCount(a);
031 int bbc = braceCount(b);
032
033 if (abc != bbc) {
034 return OverloadCompatibilityInfo.success();
035 }
036
037 OverridingUtil.OverrideCompatibilityInfo overrideCompatibilityInfo = OverridingUtil.isOverridableByImpl(a, b, false);
038 switch (overrideCompatibilityInfo.getResult()) {
039 case OVERRIDABLE:
040 case CONFLICT:
041 return OverloadCompatibilityInfo.someError();
042 case INCOMPATIBLE:
043 return OverloadCompatibilityInfo.success();
044 default:
045 throw new IllegalStateException();
046 }
047 }
048
049 private static int braceCount(CallableDescriptor a) {
050 if (a instanceof PropertyDescriptor) {
051 return 0;
052 }
053 else if (a instanceof SimpleFunctionDescriptor) {
054 return 1;
055 }
056 else if (a instanceof ConstructorDescriptor) {
057 return 1;
058 }
059 else {
060 throw new IllegalStateException();
061 }
062 }
063
064 public static class OverloadCompatibilityInfo {
065
066 private static final OverloadCompatibilityInfo SUCCESS = new OverloadCompatibilityInfo(true, "SUCCESS");
067
068 public static OverloadCompatibilityInfo success() {
069 return SUCCESS;
070 }
071
072 public static OverloadCompatibilityInfo someError() {
073 return new OverloadCompatibilityInfo(false, "XXX");
074 }
075
076
077 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
078
079 private final boolean isSuccess;
080 private final String message;
081
082 public OverloadCompatibilityInfo(boolean success, String message) {
083 isSuccess = success;
084 this.message = message;
085 }
086
087 public boolean isSuccess() {
088 return isSuccess;
089 }
090
091 public String getMessage() {
092 return message;
093 }
094
095 }
096
097 }