1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
// **********************************************************************
//
// Copyright (c) 2003
// ZeroC, Inc.
// Billerica, MA, USA
//
// All Rights Reserved.
//
// Ice is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License version 2 as published by
// the Free Software Foundation.
//
// **********************************************************************
#ifndef JAVA_UTIL_H
#define JAVA_UTIL_H
#include <Slice/Parser.h>
#include <IceUtil/OutputUtil.h>
namespace Slice
{
class SLICE_API JavaGenerator : public ::IceUtil::noncopyable
{
public:
virtual ~JavaGenerator();
//
// Validate all metadata in the unit with a "java:" prefix.
//
static void validateMetaData(const UnitPtr&);
protected:
JavaGenerator(const std::string&);
//
// Given the fully-scoped Java class name, create any intermediate
// package directories and open the class file
//
bool open(const std::string&);
void close();
::IceUtil::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 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;
//
// 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()) const;
//
// Generate code to marshal or unmarshal a type
//
void writeMarshalUnmarshalCode(::IceUtil::Output&, const std::string&, const TypePtr&, const std::string&,
bool, int&, bool = false, const StringList& = StringList(),
const std::string& patchParams = "");
//
// Generate code to marshal or unmarshal a sequence type
//
void writeSequenceMarshalUnmarshalCode(::IceUtil::Output&, const std::string&, const SequencePtr&,
const std::string&, bool, int&, bool,
const StringList& = StringList());
//
// Find custom sequence metadata.
//
static std::string findMetaData(const StringList&);
private:
class MetaDataVisitor : public ParserVisitor
{
public:
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:
void validate(const ContainedPtr&);
StringSet _history;
};
void printHeader();
std::string _dir;
::IceUtil::Output* _out;
};
}
#endif
|