1683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti/*
2683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * Copyright 2016 Federico Tomassetti
3683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti *
4683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * Licensed under the Apache License, Version 2.0 (the "License");
5683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * you may not use this file except in compliance with the License.
6683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * You may obtain a copy of the License at
7683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti *
8683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * http://www.apache.org/licenses/LICENSE-2.0
9683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti *
10683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * Unless required by applicable law or agreed to in writing, software
11683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * distributed under the License is distributed on an "AS IS" BASIS,
12683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * See the License for the specific language governing permissions and
14683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * limitations under the License.
15683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti */
16683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti
179c53c2cbc607ea694438ade8630be0c155a33162Federico Tomassettipackage com.github.javaparser.symbolsolver.logic;
18e21fca16e413a8bf31d613aa97a744d075c374ddFederico Tomassetti
195d8d0cb7947efcf2282f7d056302dd905f348532Federico Tomassettiimport com.github.javaparser.resolution.MethodUsage;
205d8d0cb7947efcf2282f7d056302dd905f348532Federico Tomassettiimport com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
215d8d0cb7947efcf2282f7d056302dd905f348532Federico Tomassettiimport com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
225d8d0cb7947efcf2282f7d056302dd905f348532Federico Tomassettiimport com.github.javaparser.resolution.types.ResolvedReferenceType;
23e21fca16e413a8bf31d613aa97a744d075c374ddFederico Tomassetti
24f20bec1be7e976300ef4857e347bc735ded0f305Federico Tomassettiimport java.util.HashSet;
25847f7c48337b56081b74ead7c93cc656817105bcFederico Tomassettiimport java.util.List;
26f20bec1be7e976300ef4857e347bc735ded0f305Federico Tomassettiimport java.util.Set;
27e21fca16e413a8bf31d613aa97a744d075c374ddFederico Tomassetti
287fe8bb73b47f94245be6e14aa802fd3717ef8b60Federico Tomassetti/**
29a9313adb1a9e27207580d484238f353fc9a30327Federico Tomassetti * Common ancestor for most types.
30a9313adb1a9e27207580d484238f353fc9a30327Federico Tomassetti *
317fe8bb73b47f94245be6e14aa802fd3717ef8b60Federico Tomassetti * @author Federico Tomassetti
327fe8bb73b47f94245be6e14aa802fd3717ef8b60Federico Tomassetti */
335d8d0cb7947efcf2282f7d056302dd905f348532Federico Tomassettipublic abstract class AbstractTypeDeclaration implements ResolvedReferenceTypeDeclaration {
34e21fca16e413a8bf31d613aa97a744d075c374ddFederico Tomassetti
35f20bec1be7e976300ef4857e347bc735ded0f305Federico Tomassetti    @Override
36a9313adb1a9e27207580d484238f353fc9a30327Federico Tomassetti    public final Set<MethodUsage> getAllMethods() {
37f20bec1be7e976300ef4857e347bc735ded0f305Federico Tomassetti        Set<MethodUsage> methods = new HashSet<>();
38f20bec1be7e976300ef4857e347bc735ded0f305Federico Tomassetti
3955d106b510714bd78b55c3690a165a50edac9679Federico Tomassetti        Set<String> methodsSignatures = new HashSet<>();
4055d106b510714bd78b55c3690a165a50edac9679Federico Tomassetti
415d8d0cb7947efcf2282f7d056302dd905f348532Federico Tomassetti        for (ResolvedMethodDeclaration methodDeclaration : getDeclaredMethods()) {
428d234965b572759181da7787fead07b225e9e5caFederico Tomassetti            methods.add(new MethodUsage(methodDeclaration));
4355d106b510714bd78b55c3690a165a50edac9679Federico Tomassetti            methodsSignatures.add(methodDeclaration.getSignature());
44f20bec1be7e976300ef4857e347bc735ded0f305Federico Tomassetti        }
45f20bec1be7e976300ef4857e347bc735ded0f305Federico Tomassetti
465d8d0cb7947efcf2282f7d056302dd905f348532Federico Tomassetti        for (ResolvedReferenceType ancestor : getAllAncestors()) {
4755d106b510714bd78b55c3690a165a50edac9679Federico Tomassetti            for (MethodUsage mu : ancestor.getDeclaredMethods()) {
4855d106b510714bd78b55c3690a165a50edac9679Federico Tomassetti                String signature = mu.getDeclaration().getSignature();
4955d106b510714bd78b55c3690a165a50edac9679Federico Tomassetti                if (!methodsSignatures.contains(signature)) {
5055d106b510714bd78b55c3690a165a50edac9679Federico Tomassetti                    methodsSignatures.add(signature);
5155d106b510714bd78b55c3690a165a50edac9679Federico Tomassetti                    methods.add(mu);
5255d106b510714bd78b55c3690a165a50edac9679Federico Tomassetti                }
5355d106b510714bd78b55c3690a165a50edac9679Federico Tomassetti            }
54f20bec1be7e976300ef4857e347bc735ded0f305Federico Tomassetti        }
55f20bec1be7e976300ef4857e347bc735ded0f305Federico Tomassetti
56f20bec1be7e976300ef4857e347bc735ded0f305Federico Tomassetti        return methods;
57f20bec1be7e976300ef4857e347bc735ded0f305Federico Tomassetti    }
58f20bec1be7e976300ef4857e347bc735ded0f305Federico Tomassetti
59f640162d77a6e37204544eb2ea29dd4ca815ce08Federico Tomassetti    @Override
60f640162d77a6e37204544eb2ea29dd4ca815ce08Federico Tomassetti    public final boolean isFunctionalInterface() {
61f640162d77a6e37204544eb2ea29dd4ca815ce08Federico Tomassetti        return FunctionalInterfaceLogic.getFunctionalMethod(this).isPresent();
62f640162d77a6e37204544eb2ea29dd4ca815ce08Federico Tomassetti    }
63847f7c48337b56081b74ead7c93cc656817105bcFederico Tomassetti
64e21fca16e413a8bf31d613aa97a744d075c374ddFederico Tomassetti}
65