Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
P
protobuf
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
protobuf
Commits
c32b9dd4
Commit
c32b9dd4
authored
Aug 29, 2016
by
Thomas Van Lenten
Committed by
GitHub
Aug 29, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2018 from thomasvl/support_generate_all
ObjC support for GenerateAll().
parents
3d9d1a12
2e66a61b
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
98 additions
and
58 deletions
+98
-58
compile_testing_protos.sh
objectivec/DevTools/compile_testing_protos.sh
+13
-13
objectivec_generator.cc
...ogle/protobuf/compiler/objectivec/objectivec_generator.cc
+33
-18
objectivec_generator.h
...oogle/protobuf/compiler/objectivec/objectivec_generator.h
+9
-2
objectivec_helpers.cc
...google/protobuf/compiler/objectivec/objectivec_helpers.cc
+37
-19
objectivec_helpers.h
src/google/protobuf/compiler/objectivec/objectivec_helpers.h
+6
-6
No files found.
objectivec/DevTools/compile_testing_protos.sh
View file @
c32b9dd4
...
...
@@ -99,26 +99,26 @@ CORE_PROTO_FILES+=(
src/google/protobuf/descriptor.proto
)
compile_proto
()
{
compile_proto
s
()
{
src/protoc
\
--objc_out
=
"
${
OUTPUT_DIR
}
/google/protobuf"
\
--proto_path
=
src/google/protobuf/
\
--proto_path
=
src
\
$*
"
$@
"
}
# Note: there is overlap in package.Message names between some of the test
# files, so they can't be generated all at once. This works because the overlap
# isn't linked into a single binary.
for
a_proto
in
"
${
CORE_PROTO_FILES
[@]
}
"
;
do
compile_proto
"
${
a_proto
}
"
compile_proto
s
"
${
a_proto
}
"
done
OBJC_PROTO_FILES
=(
objectivec/Tests/unittest_cycle.proto
objectivec/Tests/unittest_runtime_proto2.proto
objectivec/Tests/unittest_runtime_proto3.proto
objectivec/Tests/unittest_objc.proto
# Objective C specific testing protos.
compile_protos
\
--proto_path
=
"objectivec/Tests"
\
objectivec/Tests/unittest_cycle.proto
\
objectivec/Tests/unittest_runtime_proto2.proto
\
objectivec/Tests/unittest_runtime_proto3.proto
\
objectivec/Tests/unittest_objc.proto
\
objectivec/Tests/unittest_objc_startup.proto
)
for
a_proto
in
"
${
OBJC_PROTO_FILES
[@]
}
"
;
do
compile_proto
--proto_path
=
"objectivec/Tests"
"
${
a_proto
}
"
done
src/google/protobuf/compiler/objectivec/objectivec_generator.cc
View file @
c32b9dd4
...
...
@@ -45,10 +45,22 @@ ObjectiveCGenerator::ObjectiveCGenerator() {}
ObjectiveCGenerator
::~
ObjectiveCGenerator
()
{}
bool
ObjectiveCGenerator
::
HasGenerateAll
()
const
{
return
true
;
}
bool
ObjectiveCGenerator
::
Generate
(
const
FileDescriptor
*
file
,
const
string
&
parameter
,
OutputDirectory
*
output_directory
,
GeneratorContext
*
context
,
string
*
error
)
const
{
*
error
=
"Unimplemented Generate() method. Call GenerateAll() instead."
;
return
false
;
}
bool
ObjectiveCGenerator
::
GenerateAll
(
const
vector
<
const
FileDescriptor
*>&
files
,
const
string
&
parameter
,
GeneratorContext
*
context
,
string
*
error
)
const
{
// -----------------------------------------------------------------
// Parse generator options. These options are passed to the compiler using the
// --objc_opt flag. The options are passed as a comma separated list of
...
...
@@ -117,29 +129,32 @@ bool ObjectiveCGenerator::Generate(const FileDescriptor* file,
// -----------------------------------------------------------------
// Validate the objc prefix/package pairing.
if
(
!
ValidateObjCClassPrefix
(
file
,
generation_options
,
error
))
{
// Validate the objc prefix/package pairing
s
.
if
(
!
ValidateObjCClassPrefix
es
(
files
,
generation_options
,
error
))
{
// *error will have been filled in.
return
false
;
}
FileGenerator
file_generator
(
file
,
generation_options
);
string
filepath
=
FilePath
(
file
);
for
(
int
i
=
0
;
i
<
files
.
size
();
i
++
)
{
const
FileDescriptor
*
file
=
files
[
i
];
FileGenerator
file_generator
(
file
,
generation_options
);
string
filepath
=
FilePath
(
file
);
// Generate header.
{
scoped_ptr
<
io
::
ZeroCopyOutputStream
>
output
(
output_directory
->
Open
(
filepath
+
".pbobjc.h"
));
io
::
Printer
printer
(
output
.
get
(),
'$'
);
file_generator
.
GenerateHeader
(
&
printer
);
}
// Generate header.
{
scoped_ptr
<
io
::
ZeroCopyOutputStream
>
output
(
context
->
Open
(
filepath
+
".pbobjc.h"
));
io
::
Printer
printer
(
output
.
get
(),
'$'
);
file_generator
.
GenerateHeader
(
&
printer
);
}
// Generate m file.
{
scoped_ptr
<
io
::
ZeroCopyOutputStream
>
output
(
output_directory
->
Open
(
filepath
+
".pbobjc.m"
));
io
::
Printer
printer
(
output
.
get
(),
'$'
);
file_generator
.
GenerateSource
(
&
printer
);
// Generate m file.
{
scoped_ptr
<
io
::
ZeroCopyOutputStream
>
output
(
context
->
Open
(
filepath
+
".pbobjc.m"
));
io
::
Printer
printer
(
output
.
get
(),
'$'
);
file_generator
.
GenerateSource
(
&
printer
);
}
}
return
true
;
...
...
src/google/protobuf/compiler/objectivec/objectivec_generator.h
View file @
c32b9dd4
...
...
@@ -47,8 +47,15 @@ class LIBPROTOC_EXPORT ObjectiveCGenerator : public CodeGenerator {
~
ObjectiveCGenerator
();
// implements CodeGenerator ----------------------------------------
bool
Generate
(
const
FileDescriptor
*
file
,
const
string
&
parameter
,
OutputDirectory
*
output_directory
,
string
*
error
)
const
;
bool
HasGenerateAll
()
const
;
bool
Generate
(
const
FileDescriptor
*
file
,
const
string
&
parameter
,
GeneratorContext
*
context
,
string
*
error
)
const
;
bool
GenerateAll
(
const
vector
<
const
FileDescriptor
*>&
files
,
const
string
&
parameter
,
GeneratorContext
*
context
,
string
*
error
)
const
;
private
:
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
(
ObjectiveCGenerator
);
...
...
src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
View file @
c32b9dd4
...
...
@@ -980,28 +980,20 @@ bool LoadExpectedPackagePrefixes(const Options &generation_options,
generation_options
.
expected_prefixes_path
,
&
collector
,
out_error
);
}
}
// namespace
bool
ValidateObjCClassPrefix
(
const
FileDescriptor
*
file
,
const
Options
&
generation_option
s
,
string
*
out_error
)
{
bool
ValidateObjCClassPrefix
(
const
FileDescriptor
*
file
,
const
string
&
expected_prefixes_path
,
const
map
<
string
,
string
>&
expected_package_prefixe
s
,
string
*
out_error
)
{
const
string
prefix
=
file
->
options
().
objc_class_prefix
();
const
string
package
=
file
->
package
();
// NOTE: src/google/protobuf/compiler/plugin.cc makes use of cerr for some
// error cases, so it seems to be ok to use as a back door for warnings.
// Load any expected package prefixes to validate against those.
map
<
string
,
string
>
expected_package_prefixes
;
if
(
!
LoadExpectedPackagePrefixes
(
generation_options
,
&
expected_package_prefixes
,
out_error
))
{
return
false
;
}
// Check: Error - See if there was an expected prefix for the package and
// report if it doesn't match (wrong or missing).
map
<
string
,
string
>::
iterator
package_match
=
map
<
string
,
string
>::
const_
iterator
package_match
=
expected_package_prefixes
.
find
(
package
);
if
(
package_match
!=
expected_package_prefixes
.
end
())
{
// There was an entry, and...
...
...
@@ -1050,7 +1042,7 @@ bool ValidateObjCClassPrefix(const FileDescriptor* file,
// Look for any other package that uses the same prefix.
string
other_package_for_prefix
;
for
(
map
<
string
,
string
>::
iterator
i
=
expected_package_prefixes
.
begin
();
for
(
map
<
string
,
string
>::
const_
iterator
i
=
expected_package_prefixes
.
begin
();
i
!=
expected_package_prefixes
.
end
();
++
i
)
{
if
(
i
->
second
==
prefix
)
{
other_package_for_prefix
=
i
->
first
;
...
...
@@ -1068,7 +1060,7 @@ bool ValidateObjCClassPrefix(const FileDescriptor* file,
<<
"protoc:0: warning: File '"
<<
file
->
name
()
<<
"' has no "
<<
"package. Consider adding a new package to the proto and adding '"
<<
"new.package = "
<<
prefix
<<
"' to the expected prefixes file ("
<<
generation_options
.
expected_prefixes_path
<<
")."
<<
endl
;
<<
expected_prefixes_path
<<
")."
<<
endl
;
cerr
.
flush
();
}
else
{
// ... another package has declared the same prefix.
...
...
@@ -1078,7 +1070,7 @@ bool ValidateObjCClassPrefix(const FileDescriptor* file,
<<
prefix
<<
"' as its prefix. Consider either adding a new package "
<<
"to the proto, or reusing one of the packages already using this "
<<
"prefix in the expected prefixes file ("
<<
generation_options
.
expected_prefixes_path
<<
")."
<<
endl
;
<<
expected_prefixes_path
<<
")."
<<
endl
;
cerr
.
flush
();
}
return
true
;
...
...
@@ -1094,7 +1086,7 @@ bool ValidateObjCClassPrefix(const FileDescriptor* file,
"'; that prefix is already used for 'package "
+
other_package_for_prefix
+
";'. It can only be reused by listing "
+
"it in the expected file ("
+
generation_options
.
expected_prefixes_path
+
")."
;
expected_prefixes_path
+
")."
;
return
false
;
// Only report first usage of the prefix.
}
...
...
@@ -1105,13 +1097,39 @@ bool ValidateObjCClassPrefix(const FileDescriptor* file,
<<
"protoc:0: warning: Found unexpected 'option objc_class_prefix =
\"
"
<<
prefix
<<
"
\"
;' in '"
<<
file
->
name
()
<<
"';"
<<
" consider adding it to the expected prefixes file ("
<<
generation_options
.
expected_prefixes_path
<<
")."
<<
endl
;
<<
expected_prefixes_path
<<
")."
<<
endl
;
cerr
.
flush
();
}
return
true
;
}
}
// namespace
bool
ValidateObjCClassPrefixes
(
const
vector
<
const
FileDescriptor
*>&
files
,
const
Options
&
generation_options
,
string
*
out_error
)
{
// Load the expected package prefixes, if available, to validate against.
map
<
string
,
string
>
expected_package_prefixes
;
if
(
!
LoadExpectedPackagePrefixes
(
generation_options
,
&
expected_package_prefixes
,
out_error
))
{
return
false
;
}
for
(
int
i
=
0
;
i
<
files
.
size
();
i
++
)
{
bool
is_valid
=
ValidateObjCClassPrefix
(
files
[
i
],
generation_options
.
expected_prefixes_path
,
expected_package_prefixes
,
out_error
);
if
(
!
is_valid
)
{
return
false
;
}
}
return
true
;
}
TextFormatDecodeData
::
TextFormatDecodeData
()
{
}
TextFormatDecodeData
::~
TextFormatDecodeData
()
{
}
...
...
src/google/protobuf/compiler/objectivec/objectivec_helpers.h
View file @
c32b9dd4
...
...
@@ -185,12 +185,12 @@ string ProtobufFrameworkImportSymbol(const string& framework_name);
// Checks if the file is one of the proto's bundled with the library.
bool
IsProtobufLibraryBundledProtoFile
(
const
FileDescriptor
*
file
);
// Checks the prefix for
a given file and outputs any warnings needed, i
f
// there are flat out errors, then out_error is filled in
and the result is
// false.
bool
ValidateObjCClassPrefix
(
const
FileDescriptor
*
file
,
const
Options
&
generation_options
,
string
*
out_error
);
// Checks the prefix for
the given files and outputs any warnings as needed. I
f
// there are flat out errors, then out_error is filled in
with the first error
//
and the result is
false.
bool
ValidateObjCClassPrefix
es
(
const
vector
<
const
FileDescriptor
*>&
files
,
const
Options
&
generation_options
,
string
*
out_error
);
// Generate decode data needed for ObjC's GPBDecodeTextFormatName() to transform
// the input into the expected output.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment