| /* |
| * Copyright (c) 2012, 2014 Google Inc. |
| * |
| * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse |
| * Public License v1.0 which accompanies this distribution, and is available at |
| * |
| * http://www.eclipse.org/legal/epl-v10.html |
| */ |
| package com.google.eclipse.protobuf.cdt.mapping; |
| |
| import static com.google.common.collect.ImmutableList.of; |
| import static com.google.common.collect.Lists.newArrayList; |
| import static java.util.Collections.unmodifiableList; |
| |
| import com.google.common.collect.ImmutableList; |
| |
| import org.eclipse.cdt.core.dom.IName; |
| import org.eclipse.cdt.core.dom.ast.IBinding; |
| import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; |
| import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumeration; |
| import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; |
| import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; |
| import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTQualifiedName; |
| import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassType; |
| |
| import java.util.List; |
| |
| /** |
| * @author alruiz@google.com (Alex Ruiz) |
| */ |
| public class IBindings { |
| private static final ImmutableList<String> MESSAGE_SUPER_TYPES = of("::google::protobuf::Message", |
| "google::protobuf::MessageLite"); |
| |
| public boolean isMessage(IBinding binding) { |
| if (!(binding instanceof CPPClassType)) { |
| return false; |
| } |
| CPPClassType classType = (CPPClassType) binding; |
| ICPPBase[] bases = classType.getBases(); |
| if (bases.length != 1) { |
| return false; |
| } |
| IName name = bases[0].getBaseClassSpecifierName(); |
| if (!(name instanceof CPPASTQualifiedName)) { |
| return false; |
| } |
| CPPASTQualifiedName qualifiedName = (CPPASTQualifiedName) name; |
| if (!qualifiedName.isFullyQualified()) { |
| return false; |
| } |
| String qualifiedNameAsText = qualifiedName.toString(); |
| return MESSAGE_SUPER_TYPES.contains(qualifiedNameAsText); |
| } |
| |
| public List<String> qualifiedNameOf(IBinding binding) { |
| List<String> segments = newArrayList(); |
| for (IBinding owner = binding.getOwner(); owner != null; owner = owner.getOwner()) { |
| if (owner instanceof ICPPEnumeration && !((ICPPEnumeration) owner).isScoped()) { |
| continue; |
| } |
| String ownerName = owner.getName(); |
| if (ownerName == null) { |
| break; |
| } |
| if (owner instanceof ICPPFunction || owner instanceof ICPPNamespace) { |
| continue; |
| } |
| segments.add(0, ownerName); |
| } |
| segments.add(binding.getName()); |
| return unmodifiableList(segments); |
| } |
| } |