3
* Copyright (C) 2015 Christian Hergert <christian@hergert.me>
5
* This program is free software: you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation, either version 3 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19
#include <glib/gi18n.h>
21
#include "ide-c-format-provider.h"
22
#include "ide-c-indenter.h"
23
#include "ide-c-language.h"
24
#include "ide-clang-completion-provider.h"
25
#include "ide-clang-diagnostic-provider.h"
26
#include "ide-clang-highlighter.h"
27
#include "ide-clang-symbol-resolver.h"
28
#include "ide-diagnostician.h"
29
#include "ide-internal.h"
33
IdeDiagnostician *diagnostician;
34
IdeHighlighter *highlighter;
35
IdeIndenter *indenter;
36
IdeRefactory *refactory;
37
IdeSymbolResolver *symbol_resolver;
38
} IdeCLanguagePrivate;
40
static void _g_initable_iface_init (GInitableIface *iface);
42
G_DEFINE_TYPE_EXTENDED (IdeCLanguage, ide_c_language, IDE_TYPE_LANGUAGE, 0,
43
G_ADD_PRIVATE (IdeCLanguage)
44
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
45
_g_initable_iface_init))
48
ide_c_language_get_completion_providers (IdeLanguage *language)
50
GList *providers = NULL;
52
g_return_val_if_fail (IDE_IS_C_LANGUAGE (language), NULL);
54
providers = IDE_LANGUAGE_CLASS (ide_c_language_parent_class)->get_completion_providers (language);
55
providers = g_list_append (providers, g_object_new (IDE_TYPE_C_FORMAT_PROVIDER, NULL));
56
providers = g_list_append (providers, g_object_new (IDE_TYPE_CLANG_COMPLETION_PROVIDER, NULL));
61
static IdeDiagnostician *
62
ide_c_language_get_diagnostician (IdeLanguage *language)
64
IdeCLanguage *self = (IdeCLanguage *)language;
65
IdeCLanguagePrivate *priv = ide_c_language_get_instance_private (self);
67
g_return_val_if_fail (IDE_IS_C_LANGUAGE (self), NULL);
69
return priv->diagnostician;
72
static IdeHighlighter *
73
ide_c_language_get_highlighter (IdeLanguage *language)
75
IdeCLanguage *self = (IdeCLanguage *)language;
76
IdeCLanguagePrivate *priv = ide_c_language_get_instance_private (self);
78
g_return_val_if_fail (IDE_IS_C_LANGUAGE (self), NULL);
80
return priv->highlighter;
84
ide_c_language_get_indenter (IdeLanguage *language)
86
IdeCLanguage *self = (IdeCLanguage *)language;
87
IdeCLanguagePrivate *priv = ide_c_language_get_instance_private (self);
89
g_return_val_if_fail (IDE_IS_C_LANGUAGE (self), NULL);
91
return priv->indenter;
95
ide_c_language_get_refactory (IdeLanguage *language)
97
IdeCLanguage *self = (IdeCLanguage *)language;
98
IdeCLanguagePrivate *priv = ide_c_language_get_instance_private (self);
100
g_return_val_if_fail (IDE_IS_C_LANGUAGE (self), NULL);
102
return priv->refactory;
105
static IdeSymbolResolver *
106
ide_c_language_get_symbol_resolver (IdeLanguage *language)
108
IdeCLanguage *self = (IdeCLanguage *)language;
109
IdeCLanguagePrivate *priv = ide_c_language_get_instance_private (self);
111
g_return_val_if_fail (IDE_IS_C_LANGUAGE (self), NULL);
113
return priv->symbol_resolver;
117
ide_c_language_get_name (IdeLanguage *self)
123
ide_c_language_dispose (GObject *object)
125
IdeCLanguage *self = (IdeCLanguage *)object;
126
IdeCLanguagePrivate *priv = ide_c_language_get_instance_private (self);
128
g_clear_object (&priv->diagnostician);
129
g_clear_object (&priv->highlighter);
130
g_clear_object (&priv->indenter);
131
g_clear_object (&priv->refactory);
132
g_clear_object (&priv->symbol_resolver);
134
G_OBJECT_CLASS (ide_c_language_parent_class)->dispose (object);
138
ide_c_language_class_init (IdeCLanguageClass *klass)
140
IdeLanguageClass *language_class = IDE_LANGUAGE_CLASS (klass);
141
GObjectClass *object_class = G_OBJECT_CLASS (klass);
143
language_class->get_completion_providers = ide_c_language_get_completion_providers;
144
language_class->get_diagnostician = ide_c_language_get_diagnostician;
145
language_class->get_highlighter = ide_c_language_get_highlighter;
146
language_class->get_indenter = ide_c_language_get_indenter;
147
language_class->get_refactory = ide_c_language_get_refactory;
148
language_class->get_symbol_resolver = ide_c_language_get_symbol_resolver;
149
language_class->get_name = ide_c_language_get_name;
151
object_class->dispose = ide_c_language_dispose;
155
ide_c_language_init (IdeCLanguage *self)
160
ide_c_language_initiable_init (GInitable *initable,
161
GCancellable *cancellable,
164
IdeCLanguage *self = (IdeCLanguage *)initable;
165
IdeCLanguagePrivate *priv = ide_c_language_get_instance_private (self);
168
g_return_val_if_fail (IDE_IS_C_LANGUAGE (self), FALSE);
169
g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), FALSE);
171
id = ide_language_get_id (IDE_LANGUAGE (self));
173
if ((g_strcmp0 (id, "c") == 0) ||
174
(g_strcmp0 (id, "chdr") == 0) ||
175
(g_strcmp0 (id, "cpp") == 0))
178
IdeDiagnosticProvider *provider;
180
context = ide_object_get_context (IDE_OBJECT (initable));
183
* Create our diagnostician using clang as a backend.
185
priv->diagnostician = g_object_new (IDE_TYPE_DIAGNOSTICIAN,
188
provider = g_object_new (IDE_TYPE_CLANG_DIAGNOSTIC_PROVIDER,
191
_ide_diagnostician_add_provider (priv->diagnostician, provider);
192
g_clear_object (&provider);
195
* Create our highlighter that will use clang for semantic highlighting.
197
priv->highlighter = g_object_new (IDE_TYPE_CLANG_HIGHLIGHTER,
202
* Create our indenter to provide as-you-type indentation.
204
* TODO: How can we disambiguate c/c++/obj-c headers?
206
if (!ide_str_equal0 (id, "cpp"))
207
priv->indenter = g_object_new (IDE_TYPE_C_INDENTER,
212
* TODO: Refactory design (rename local, extract method, etc).
216
* Create our symbol resolver to help discover symbols within a file
217
* as well as what symbol is at "location X".
219
priv->symbol_resolver = g_object_new (IDE_TYPE_CLANG_SYMBOL_RESOLVER,
228
G_IO_ERROR_NOT_SUPPORTED,
229
_("Language id does not match a C language."));
235
_g_initable_iface_init (GInitableIface *iface)
237
iface->init = ide_c_language_initiable_init;