Convert IntrinsicsMap to Kotlin
This commit is contained in:
@@ -1,118 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.codegen.intrinsics;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
|
||||||
import org.jetbrains.kotlin.name.FqName;
|
|
||||||
import org.jetbrains.kotlin.name.FqNameUnsafe;
|
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
class IntrinsicsMap {
|
|
||||||
private static final class Key {
|
|
||||||
private final FqNameUnsafe owner;
|
|
||||||
private final FqNameUnsafe receiverParameter;
|
|
||||||
private final String name;
|
|
||||||
private final int valueParameterCount;
|
|
||||||
|
|
||||||
private Key(@NotNull FqNameUnsafe owner, @Nullable FqNameUnsafe receiverParameter, @NotNull String name, int valueParameterCount) {
|
|
||||||
this.owner = owner;
|
|
||||||
this.receiverParameter = receiverParameter;
|
|
||||||
this.name = name;
|
|
||||||
this.valueParameterCount = valueParameterCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) return true;
|
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
|
||||||
|
|
||||||
Key key = (Key) o;
|
|
||||||
|
|
||||||
if (valueParameterCount != key.valueParameterCount) return false;
|
|
||||||
if (!name.equals(key.name)) return false;
|
|
||||||
if (!owner.equals(key.owner)) return false;
|
|
||||||
if (receiverParameter == null ? key.receiverParameter != null : !receiverParameter.equals(key.receiverParameter)) return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int result = owner.hashCode();
|
|
||||||
result = 31 * result + name.hashCode();
|
|
||||||
result = 31 * result + valueParameterCount;
|
|
||||||
result = 31 * result + (receiverParameter != null ? receiverParameter.hashCode() : 0);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int valueParameterCountForKey(@NotNull CallableMemberDescriptor member) {
|
|
||||||
if (member instanceof PropertyDescriptor) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return member.getValueParameters().size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private final Map<Key, IntrinsicMethod> intrinsicsMap = new HashMap<>();
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param valueParameterCount -1 for property
|
|
||||||
*/
|
|
||||||
public void registerIntrinsic(
|
|
||||||
@NotNull FqName owner,
|
|
||||||
@Nullable FqNameUnsafe receiverParameter,
|
|
||||||
@NotNull String name,
|
|
||||||
int valueParameterCount,
|
|
||||||
@NotNull IntrinsicMethod impl
|
|
||||||
) {
|
|
||||||
intrinsicsMap.put(new Key(owner.toUnsafe(), receiverParameter, name, valueParameterCount), impl);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public IntrinsicMethod getIntrinsic(@NotNull CallableMemberDescriptor descriptor) {
|
|
||||||
Key key = new Key(
|
|
||||||
DescriptorUtils.getFqName(descriptor.getContainingDeclaration()),
|
|
||||||
getReceiverParameterFqName(descriptor),
|
|
||||||
descriptor.getName().asString(),
|
|
||||||
valueParameterCountForKey(descriptor)
|
|
||||||
);
|
|
||||||
return intrinsicsMap.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private static FqNameUnsafe getReceiverParameterFqName(@NotNull CallableMemberDescriptor descriptor) {
|
|
||||||
ReceiverParameterDescriptor receiverParameter = descriptor.getExtensionReceiverParameter();
|
|
||||||
if (receiverParameter == null) return null;
|
|
||||||
|
|
||||||
ClassifierDescriptor classifier = receiverParameter.getType().getConstructor().getDeclarationDescriptor();
|
|
||||||
if (classifier == null) return null;
|
|
||||||
|
|
||||||
if (classifier instanceof TypeParameterDescriptor) {
|
|
||||||
return IntrinsicMethods.RECEIVER_PARAMETER_FQ_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
return DescriptorUtils.getFqName(classifier);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2015 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.codegen.intrinsics
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.FqNameUnsafe
|
||||||
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
internal class IntrinsicsMap {
|
||||||
|
|
||||||
|
private val intrinsicsMap = HashMap<Key, IntrinsicMethod>()
|
||||||
|
|
||||||
|
private data class Key(
|
||||||
|
private val owner: FqNameUnsafe,
|
||||||
|
private val receiverParameter: FqNameUnsafe?,
|
||||||
|
private val name: String,
|
||||||
|
private val valueParameterCount: Int
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun valueParameterCountForKey(member: CallableMemberDescriptor): Int =
|
||||||
|
if (member is PropertyDescriptor)
|
||||||
|
-1
|
||||||
|
else
|
||||||
|
member.valueParameters.size
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param valueParameterCount -1 for property
|
||||||
|
*/
|
||||||
|
fun registerIntrinsic(
|
||||||
|
owner: FqName,
|
||||||
|
receiverParameter: FqNameUnsafe?,
|
||||||
|
name: String,
|
||||||
|
valueParameterCount: Int,
|
||||||
|
impl: IntrinsicMethod
|
||||||
|
) {
|
||||||
|
intrinsicsMap[Key(owner.toUnsafe(), receiverParameter, name, valueParameterCount)] = impl
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getIntrinsic(descriptor: CallableMemberDescriptor): IntrinsicMethod? =
|
||||||
|
intrinsicsMap[Key(
|
||||||
|
DescriptorUtils.getFqName(descriptor.containingDeclaration),
|
||||||
|
getReceiverParameterFqName(descriptor),
|
||||||
|
descriptor.name.asString(),
|
||||||
|
valueParameterCountForKey(descriptor)
|
||||||
|
)]
|
||||||
|
|
||||||
|
private fun getReceiverParameterFqName(descriptor: CallableMemberDescriptor): FqNameUnsafe? {
|
||||||
|
val receiverParameter = descriptor.extensionReceiverParameter ?: return null
|
||||||
|
val classifier = receiverParameter.type.constructor.declarationDescriptor ?: return null
|
||||||
|
|
||||||
|
return if (classifier is TypeParameterDescriptor)
|
||||||
|
IntrinsicMethods.RECEIVER_PARAMETER_FQ_NAME
|
||||||
|
else
|
||||||
|
DescriptorUtils.getFqName(classifier)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user