if (sym is DynamicProperty || sym is DynamicMethod) {
return "";
}
- if (sym.parent_symbol != null) {
+ if (sym.parent_symbol != null && !sym.is_extern) {
var parent_headers = get_ccode_header_filenames (sym.parent_symbol);
if (parent_headers.length > 0) {
return parent_headers;
}
}
- if (sym.source_reference != null && !sym.external_package) {
+ if (sym.source_reference != null && !sym.external_package && !sym.is_extern) {
// don't add default include directives for VAPI files
return sym.source_reference.file.get_cinclude_filename ();
}
if (sym is Constant && ((Constant) sym).value is InitializerList) {
return false;
}
- if (sym.external_package || (!decl_space.is_header && CodeContext.get ().use_header && !sym.is_internal_symbol ())) {
+ if (sym.external_package || (!decl_space.is_header && CodeContext.get ().use_header && !sym.is_internal_symbol ())
+ || (sym.is_extern && get_ccode_header_filenames (sym).length > 0)) {
// add feature test macros
foreach (unowned string feature_test_macro in get_ccode_feature_test_macros (sym).split (",")) {
decl_space.add_feature_test_macro (feature_test_macro);
}
// add appropriate include file
foreach (unowned string header_filename in get_ccode_header_filenames (sym).split (",")) {
- decl_space.add_include (header_filename, !sym.external_package ||
- (sym.external_package &&
- sym.from_commandline));
+ decl_space.add_include (header_filename,
+ !sym.is_extern && (!sym.external_package || (sym.external_package && sym.from_commandline)));
}
// declaration complete
return true;
methods/lambda.vala \
methods/closures.vala \
methods/contains.vala \
+ methods/extern.vala \
methods/iterator.vala \
methods/prepostconditions.vala \
methods/same-name.vala \
--- /dev/null
+[CCode (cname = "g_strdup", cheader_filename = "glib.h")]
+extern string strdup (string s);
+
+[CCode (cname = "vala_some_thing")]
+extern void some_thing ();
+
+namespace Foo {
+ [CCode (cname = "g_strdup", cheader_filename = "glib.h")]
+ extern string strdup (string s);
+
+ [CCode (cname = "vala_some_thing")]
+ extern void some_thing ();
+}
+
+public class Bar {
+ [CCode (cname = "g_strdup", cheader_filename = "glib.h")]
+ public static extern string strdup (string s);
+
+ [CCode (cname = "vala_some_thing")]
+ public static extern void some_thing ();
+}
+
+void main () {
+ assert ("foo" == strdup ("foo"));
+ assert ("foo" == Foo.strdup ("foo"));
+ assert ("foo" == Bar.strdup ("foo"));
+
+ assert (some_thing != null);
+ assert (Foo.some_thing != null);
+ assert (Bar.some_thing != null);
+}
to_string_method = new Method ("to_string", string_type);
to_string_method.access = SymbolAccessibility.PUBLIC;
to_string_method.is_extern = true;
+ to_string_method.set_attribute_string ("CCode", "cheader_filename", "glib-object.h");
to_string_method.owner = type_symbol.scope;
to_string_method.this_parameter = new Parameter ("this", this);
to_string_method.scope.add (to_string_method.this_parameter.name, to_string_method.this_parameter);