summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/JavaUtil.h
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2016-05-12 10:21:51 -0400
committerBernard Normier <bernard@zeroc.com>2016-05-12 10:21:51 -0400
commit6ea27c2fc2478cea6a42bad30e746f7ebf9c69af (patch)
treea52106addf73a73fbeb5e33c26ff9f8908b62a24 /cpp/src/Slice/JavaUtil.h
parentUWP test suite fixes (diff)
downloadice-6ea27c2fc2478cea6a42bad30e746f7ebf9c69af.tar.bz2
ice-6ea27c2fc2478cea6a42bad30e746f7ebf9c69af.tar.xz
ice-6ea27c2fc2478cea6a42bad30e746f7ebf9c69af.zip
Renamed ICE_UTIL_API to ICE_API and other cleanups
Diffstat (limited to 'cpp/src/Slice/JavaUtil.h')
-rw-r--r--cpp/src/Slice/JavaUtil.h258
1 files changed, 258 insertions, 0 deletions
diff --git a/cpp/src/Slice/JavaUtil.h b/cpp/src/Slice/JavaUtil.h
new file mode 100644
index 00000000000..6473f406e0e
--- /dev/null
+++ b/cpp/src/Slice/JavaUtil.h
@@ -0,0 +1,258 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef JAVA_UTIL_H
+#define JAVA_UTIL_H
+
+#include <Slice/Parser.h>
+#include <IceUtil/OutputUtil.h>
+
+namespace Slice
+{
+
+//
+// Compute Java serialVersionUID for a Slice class
+//
+long
+computeSerialVersionUUID(const ClassDefPtr&);
+
+//
+// Compute Java serialVersionUID for a Slice class
+//
+long
+computeSerialVersionUUID(const ExceptionPtr&);
+
+//
+// Compute Java serialVersionUID for a Slice struct
+//
+long
+computeSerialVersionUUID(const StructPtr&);
+
+class JavaOutput : public ::IceUtilInternal::Output
+{
+public:
+
+ JavaOutput();
+ JavaOutput(std::ostream&);
+ JavaOutput(const char*);
+
+ //
+ // Open a file to hold the source for a Java class. The first
+ // argument is the class name (including an optional leading
+ // package). Intermediate directories will be created as
+ // necessary to open the file in the package. The second
+ // argument specifies a directory prefix in which to locate
+ // the class.
+ //
+ // After successfully opening the file, the function invokes
+ // printHeader() and then emits a "package" statement if
+ // necessary.
+ //
+ void openClass(const std::string&, const std::string&, const std::string& = std::string());
+
+ virtual void printHeader();
+};
+
+class JavaGenerator : private ::IceUtil::noncopyable
+{
+public:
+
+ virtual ~JavaGenerator();
+
+ //
+ // Validate all metadata in the unit with a "java:" prefix.
+ //
+ static void validateMetaData(const UnitPtr&);
+
+ void close();
+
+protected:
+
+ JavaGenerator(const std::string&);
+
+ //
+ // Given the fully-scoped Java class name, create any intermediate
+ // package directories and open the class file,
+ //
+ void open(const std::string&, const std::string&);
+
+ ::IceUtilInternal::Output& output() const;
+
+ //
+ // Check a symbol against any of the Java keywords. If a
+ // match is found, return the symbol with a leading underscore.
+ //
+ std::string fixKwd(const std::string&) const;
+
+ //
+ // Convert a Slice scoped name into a Java name.
+ //
+ std::string convertScopedName(const std::string&,
+ const std::string& = std::string(),
+ const std::string& = std::string()) const;
+
+
+ //
+ // Returns the package prefix for a give Slice file.
+ //
+ std::string getPackagePrefix(const ContainedPtr&) const;
+
+ //
+ // Returns the Java package of a Contained entity.
+ //
+ std::string getPackage(const ContainedPtr&) const;
+
+ //
+ // Returns the Java name for a Contained entity. If the optional
+ // package argument matches the entity's package name, then the
+ // package is removed from the result.
+ //
+ std::string getAbsolute(const ContainedPtr&,
+ const std::string& = std::string(),
+ const std::string& = std::string(),
+ const std::string& = std::string()) const;
+
+ //
+ // Return the method call necessary to obtain the static type ID for an object type.
+ //
+ std::string getStaticId(const TypePtr&, const std::string&) const;
+
+ //
+ // Determines whether an operation should use the optional mapping.
+ //
+ bool useOptionalMapping(const OperationPtr&);
+
+ //
+ // Returns the optional type corresponding to the given Slice type.
+ //
+ std::string getOptionalFormat(const TypePtr&);
+
+ //
+ // Get the Java name for a type. If an optional scope is provided,
+ // the scope will be removed from the result if possible.
+ //
+ enum TypeMode
+ {
+ TypeModeIn,
+ TypeModeOut,
+ TypeModeMember,
+ TypeModeReturn
+ };
+ std::string typeToString(const TypePtr&, TypeMode, const std::string& = std::string(),
+ const StringList& = StringList(), bool = true, bool = false) const;
+
+ //
+ // Get the Java object name for a type. For primitive types, this returns the
+ // Java class type (e.g., Integer). For all other types, this function delegates
+ // to typeToString.
+ //
+ std::string typeToObjectString(const TypePtr&, TypeMode, const std::string& = std::string(),
+ const StringList& = StringList(), bool = true) const;
+
+ //
+ // Generate code to marshal or unmarshal a type.
+ //
+ enum OptionalMode
+ {
+ OptionalNone,
+ OptionalInParam,
+ OptionalOutParam,
+ OptionalReturnParam,
+ OptionalMember
+ };
+
+ void writeMarshalUnmarshalCode(::IceUtilInternal::Output&, const std::string&, const TypePtr&, OptionalMode,
+ bool, int, const std::string&, bool, int&, bool = false,
+ const StringList& = StringList(), const std::string& patchParams = "");
+
+ //
+ // Generate code to marshal or unmarshal a dictionary type.
+ //
+ void writeDictionaryMarshalUnmarshalCode(::IceUtilInternal::Output&, const std::string&, const DictionaryPtr&,
+ const std::string&, bool, int&, bool,
+ const StringList& = StringList());
+
+ //
+ // Generate code to marshal or unmarshal a sequence type.
+ //
+ void writeSequenceMarshalUnmarshalCode(::IceUtilInternal::Output&, const std::string&, const SequencePtr&,
+ const std::string&, bool, int&, bool, const StringList& = StringList());
+
+ //
+ // Search metadata for an entry with the given prefix and return the entire string.
+ //
+ static bool findMetaData(const std::string&, const StringList&, std::string&);
+
+ //
+ // Get custom type metadata. If metadata is found, the abstract and
+ // concrete types are extracted and the function returns true. If an
+ // abstract type is not specified, it is set to an empty string.
+ //
+ static bool getTypeMetaData(const StringList&, std::string&, std::string&);
+
+ //
+ // Determine whether a custom type is defined. The function checks the
+ // metadata of the type's original definition, as well as any optional
+ // metadata that typically represents a data member or parameter.
+ //
+ static bool hasTypeMetaData(const TypePtr&, const StringList& = StringList());
+
+ //
+ // Obtain the concrete and abstract types for a dictionary or sequence type.
+ // The functions return true if a custom type was defined and false to indicate
+ // the default mapping was used.
+ //
+ bool getDictionaryTypes(const DictionaryPtr&, const std::string&, const StringList&,
+ std::string&, std::string&) const;
+ bool getSequenceTypes(const SequencePtr&, const std::string&, const StringList&, std::string&, std::string&) const;
+
+ bool sequenceHasHolder(const SequencePtr&) const;
+
+ virtual JavaOutput* createOutput();
+
+ static const std::string _getSetMetaData;
+
+private:
+
+ class MetaDataVisitor : public ParserVisitor
+ {
+ public:
+
+ virtual bool visitUnitStart(const UnitPtr&);
+ virtual bool visitModuleStart(const ModulePtr&);
+ virtual void visitClassDecl(const ClassDeclPtr&);
+ virtual bool visitClassDefStart(const ClassDefPtr&);
+ virtual bool visitExceptionStart(const ExceptionPtr&);
+ virtual bool visitStructStart(const StructPtr&);
+ virtual void visitOperation(const OperationPtr&);
+ virtual void visitDataMember(const DataMemberPtr&);
+ virtual void visitSequence(const SequencePtr&);
+ virtual void visitDictionary(const DictionaryPtr&);
+ virtual void visitEnum(const EnumPtr&);
+ virtual void visitConst(const ConstPtr&);
+
+ private:
+
+ StringList getMetaData(const ContainedPtr&);
+ void validateType(const SyntaxTreeBasePtr&, const StringList&, const std::string&, const std::string&);
+ void validateGetSet(const SyntaxTreeBasePtr&, const StringList&, const std::string&, const std::string&);
+
+ StringSet _history;
+ };
+
+ friend class JavaGenerator::MetaDataVisitor;
+
+ std::string _dir;
+ ::IceUtilInternal::Output* _out;
+ mutable std::map<std::string, std::string> _filePackagePrefix;
+};
+
+}
+
+#endif