16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/*
26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project
36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License.
66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at
76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software
116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and
146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License.
156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */
166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#ifndef AAPT_JAVA_CLASS_GENERATOR_H
186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#define AAPT_JAVA_CLASS_GENERATOR_H
196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "ResourceTable.h"
216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "ResourceValues.h"
227656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski#include "process/IResourceTableConsumer.h"
231ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "util/StringPiece.h"
241ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <ostream>
266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string>
276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt {
296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
30b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinskiclass AnnotationProcessor;
316cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiclass ClassDefinition;
32b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski
331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskistruct JavaClassGeneratorOptions {
341ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    /*
351ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski     * Specifies whether to use the 'final' modifier
361ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski     * on resource entries. Default is true.
371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski     */
381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    bool useFinal = true;
399e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
409e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    enum class SymbolTypes {
419e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        kAll,
429e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        kPublicPrivate,
439e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        kPublic,
449e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    };
459e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
469e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    SymbolTypes types = SymbolTypes::kAll;
473524a23edb88f0e67352d55ac6a2919f1edf7b30Adam Lesinski
483524a23edb88f0e67352d55ac6a2919f1edf7b30Adam Lesinski    /**
493524a23edb88f0e67352d55ac6a2919f1edf7b30Adam Lesinski     * A list of JavaDoc annotations to add to the comments of all generated classes.
503524a23edb88f0e67352d55ac6a2919f1edf7b30Adam Lesinski     */
513524a23edb88f0e67352d55ac6a2919f1edf7b30Adam Lesinski    std::vector<std::string> javadocAnnotations;
521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski};
531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/*
556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Generates the R.java file for a resource table.
566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */
571ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiclass JavaClassGenerator {
586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskipublic:
597656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    JavaClassGenerator(IAaptContext* context, ResourceTable* table,
607656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski                       const JavaClassGeneratorOptions& options);
616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    /*
63769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski     * Writes the R.java file to `out`. Only symbols belonging to `package` are written.
64769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski     * All symbols technically belong to a single package, but linked libraries will
65769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski     * have their names mangled, denoting that they came from a different package.
66769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski     * We need to generate these symbols in a separate file.
67769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski     * Returns true on success.
686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski     */
699e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    bool generate(const StringPiece16& packageNameToGenerate, std::ostream* out);
709e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
719e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    bool generate(const StringPiece16& packageNameToGenerate,
729e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski                  const StringPiece16& outputPackageName,
739e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski                  std::ostream* out);
746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    const std::string& getError() const;
766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiprivate:
786cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski    bool addMembersToTypeClass(const StringPiece16& packageNameToGenerate,
796cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski                               const ResourceTablePackage* package,
806cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski                               const ResourceTableType* type,
816cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski                               ClassDefinition* outTypeClassDef);
826cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski
836cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski    void addMembersToStyleableClass(const StringPiece16& packageNameToGenerate,
846cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski                                    const std::u16string& entryName,
856cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski                                    const Styleable* styleable,
866cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski                                    ClassDefinition* outStyleableClassDef);
876f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
889e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    bool skipSymbol(SymbolState state);
899e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
907656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    IAaptContext* mContext;
911ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ResourceTable* mTable;
921ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    JavaClassGeneratorOptions mOptions;
936f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::string mError;
946f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski};
956f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
966f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline const std::string& JavaClassGenerator::getError() const {
976f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return mError;
986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
1006f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt
1016f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
1026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#endif // AAPT_JAVA_CLASS_GENERATOR_H
103