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.codegen; 018 019 import com.intellij.openapi.util.Pair; 020 import org.jetbrains.annotations.NotNull; 021 import org.jetbrains.asm4.Type; 022 import org.jetbrains.asm4.commons.Method; 023 import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil; 024 import org.jetbrains.jet.descriptors.serialization.NameTable; 025 import org.jetbrains.jet.descriptors.serialization.ProtoBuf; 026 import org.jetbrains.jet.descriptors.serialization.SerializerExtension; 027 import org.jetbrains.jet.lang.descriptors.*; 028 import org.jetbrains.jet.lang.resolve.name.Name; 029 030 public class JavaSerializerExtension extends SerializerExtension { 031 private final MemberMap memberMap; 032 033 public JavaSerializerExtension(@NotNull MemberMap memberMap) { 034 this.memberMap = memberMap; 035 } 036 037 @Override 038 public void serializeCallable( 039 @NotNull CallableMemberDescriptor callable, 040 @NotNull ProtoBuf.Callable.Builder proto, 041 @NotNull NameTable nameTable 042 ) { 043 saveSignature(callable, proto, nameTable); 044 saveSrcClassName(callable, proto, nameTable); 045 } 046 047 private void saveSignature( 048 @NotNull CallableMemberDescriptor callable, 049 @NotNull ProtoBuf.Callable.Builder proto, 050 @NotNull NameTable nameTable 051 ) { 052 if (callable instanceof FunctionDescriptor) { 053 Method method = memberMap.getMethodOfDescriptor((FunctionDescriptor) callable); 054 if (method != null) { 055 JavaProtoBufUtil.saveMethodSignature(proto, method, nameTable); 056 } 057 } 058 else if (callable instanceof PropertyDescriptor) { 059 PropertyDescriptor property = (PropertyDescriptor) callable; 060 061 PropertyGetterDescriptor getter = property.getGetter(); 062 PropertySetterDescriptor setter = property.getSetter(); 063 Method getterMethod = getter == null ? null : memberMap.getMethodOfDescriptor(getter); 064 Method setterMethod = setter == null ? null : memberMap.getMethodOfDescriptor(setter); 065 066 Pair<Type, String> field = memberMap.getFieldOfProperty(property); 067 Type fieldType; 068 String fieldName; 069 boolean isStaticInOuter; 070 String syntheticMethodName; 071 if (field != null) { 072 fieldType = field.first; 073 fieldName = field.second; 074 isStaticInOuter = memberMap.isStaticFieldInOuterClass(property); 075 syntheticMethodName = null; 076 } 077 else { 078 fieldType = null; 079 fieldName = null; 080 isStaticInOuter = false; 081 syntheticMethodName = memberMap.getSyntheticMethodNameOfProperty(property); 082 } 083 084 JavaProtoBufUtil.savePropertySignature(proto, fieldType, fieldName, isStaticInOuter, syntheticMethodName, getterMethod, 085 setterMethod, nameTable); 086 } 087 } 088 089 private void saveSrcClassName( 090 @NotNull CallableMemberDescriptor callable, 091 @NotNull ProtoBuf.Callable.Builder proto, 092 @NotNull NameTable nameTable 093 ) { 094 Name name = memberMap.getSrcClassNameOfCallable(callable); 095 if (name != null) { 096 JavaProtoBufUtil.saveSrcClassName(proto, name, nameTable); 097 } 098 } 099 }