/*
* Copyright 2010-2016 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.resolve.scopes;
import kotlin.
Unit;
import org.jetbrains.annotations.
NotNull;
import org.jetbrains.annotations.
Nullable;
import org.jetbrains.kotlin.descriptors.
PropertyDescriptor;
import org.jetbrains.kotlin.descriptors.
TypeParameterDescriptor;
import org.jetbrains.kotlin.descriptors.
VariableDescriptorWithAccessors;
import org.jetbrains.kotlin.utils.
Printer;
public final class
ScopeUtils {
private
ScopeUtils() {}
public static
LexicalScope makeScopeForPropertyHeader(
@
NotNull LexicalScope parent,
@
NotNull PropertyDescriptor propertyDescriptor
) {
return new
LexicalScopeImpl(
parent,
propertyDescriptor, false, null,
LexicalScopeKind.
PROPERTY_HEADER,
// redeclaration on type parameters should be reported early, see: DescriptorResolver.resolvePropertyDescriptor()
LocalRedeclarationChecker.
DO_NOTHING.
INSTANCE,
handler -> {
for (
TypeParameterDescriptor typeParameterDescriptor :
propertyDescriptor.
getTypeParameters()) {
handler.
addClassifierDescriptor(
typeParameterDescriptor);
}
return
Unit.
INSTANCE;
});
}
@
NotNull
public static
LexicalScope makeScopeForPropertyInitializer(
@
NotNull LexicalScope propertyHeader,
@
NotNull PropertyDescriptor propertyDescriptor
) {
return new
LexicalScopeImpl(
propertyHeader,
propertyDescriptor, false, null,
LexicalScopeKind.
PROPERTY_INITIALIZER_OR_DELEGATE);
}
@
NotNull
public static
LexicalScope makeScopeForDelegateConventionFunctions(
@
NotNull LexicalScope parent,
@
NotNull VariableDescriptorWithAccessors variableDescriptor
) {
// todo: very strange scope!
return new
LexicalScopeImpl(
parent,
variableDescriptor, true,
variableDescriptor.
getExtensionReceiverParameter(),
LexicalScopeKind.
PROPERTY_DELEGATE_METHOD
);
}
// TestOnly
@
NotNull
public static
String printStructure(@
Nullable MemberScope scope) {
StringBuilder out = new
StringBuilder();
Printer p = new
Printer(
out);
if (
scope == null) {
p.
println("null");
}
else {
scope.
printScopeStructure(
p);
}
return
out.
toString();
}
}