11b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams/*
21b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * Copyright 2012, The Android Open Source Project
31b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams *
41b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
51b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * you may not use this file except in compliance with the License.
61b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * You may obtain a copy of the License at
71b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams *
81b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams *     http://www.apache.org/licenses/LICENSE-2.0
91b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams *
101b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * Unless required by applicable law or agreed to in writing, software
111b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
121b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * See the License for the specific language governing permissions and
141b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * limitations under the License.
151b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams */
161b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
171b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_BASE_H_  // NOLINT
181b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_BASE_H_
191b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
201b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#include <fstream>
211b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#include <iostream>
221b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#include <map>
231b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#include <set>
241b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#include <string>
251b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#include <vector>
261b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
271b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#include "llvm/ADT/StringExtras.h"
281b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
291b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#include "slang_assert.h"
301b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#include "slang_rs_export_type.h"
311b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
321b6a0883cd6984e11e59b0c847fb334df1f41afcJason Samsnamespace slang {
331b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    class RSContext;
341b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    class RSExportVar;
351b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    class RSExportFunc;
361b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    class RSExportForEach;
371b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
381b6a0883cd6984e11e59b0c847fb334df1f41afcJason Samsclass RSReflectionBase {
391b6a0883cd6984e11e59b0c847fb334df1f41afcJason Samsprotected:
401b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    const RSContext *mRSContext;
411b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
42003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines    // Generated RS Elements for type-checking code.
43003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines    std::set<std::string> mTypesToCheck;
441b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
451b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    RSReflectionBase(const RSContext *);
461b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
471b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
481b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    bool mVerbose;
491b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
501b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    std::string mLicenseNote;
511b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    std::string mInputFileName;
521b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
531b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    std::string mClassName;
541b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    std::string mOutputPath;
551b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    std::string mOutputBCFileName;
561b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
571b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    std::vector< std::string > mText;
581b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    std::string mIndent;
591b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
601b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    bool openFile(const std::string &name, std::string &errorMsg);
611b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    void startFile(const std::string &filename);
621b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    void incIndent();
631b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    void decIndent();
641b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    void write(const std::string &t);
65192392fc5ffedc06eb8ae2b89d703b3c658fddd6Jason Sams    void write(const std::stringstream &t);
661b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
671b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    std::string stripRS(const std::string &s) const;
681b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
69b2fbbb91bd9d86e2dd56b2d102752e8c51aaafdfTim Murray    bool writeFile(const std::string &filename, const std::vector< std::string > &txt);
701b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
71003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines    bool addTypeNameForElement(const std::string &TypeName);
721b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
7380706836b18127b5733d790613a5d1b9f97cbb1dStephen Hines    static const char *getVectorAccessor(unsigned index);
7480706836b18127b5733d790613a5d1b9f97cbb1dStephen Hines
751b6a0883cd6984e11e59b0c847fb334df1f41afcJason Samsprivate:
761b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
771b6a0883cd6984e11e59b0c847fb334df1f41afcJason Samspublic:
787dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines    typedef std::vector<std::pair<std::string, std::string> > ArgTy;
797dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines
801b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams    virtual ~RSReflectionBase();
811b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
82192392fc5ffedc06eb8ae2b89d703b3c658fddd6Jason Sams    static std::string genInitValue(const clang::APValue &Val, bool asBool=false);
831b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
841b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams};  // class RSReflection
851b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
861b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams}   // namespace slang
871b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams
881b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_BASE_H_  NOLINT
89